请选择 进入手机版 | 继续访问电脑版

93编程学习论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
热搜: 活动 交友 discuz
查看: 1750|回复: 0

【每天一道编程题046】C语言求回文数

[复制链接]

  离线 

已抛锚 成长值: 10

  • TA的每日心情
    郁闷
    3 天前
  • 签到天数: 83 天

    [LV.6]常住居民II

    356

    主题

    415

    帖子

    2664

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2664
    发表于 2019-12-17 18:24:40 | 显示全部楼层 |阅读模式
    问题描述:

    打印所有不超过n(取n<256)的其平方具有对称性质的数(也称回文数)。
    问题分析:

    对于要判定的数n计算出其平方后(存于a),按照“回文数”的定义要将最高位与最低位、次高位与次低位……进行比较,若彼此相等则为回文数。此算法需要知道平方数的位数,再一一将每一位分解、比较,此方法对于位数已知且位数不是太多的数来说比较适用。

    此问题可借助数组来解决。将平方后的(a的)每一位进行分解,按从低位到高位的顺序依次暂存到数组中,再将数组中的元素按照下标从大到小的顺序重新将其组合成一个数众(如n=15,则a=225且k=522),若k等于n×n则可判定n为回文数。




    算法设计:

    从低位到高位将某一整数拆分。对于一个整数(设变量名为a)无论其位数多少,若欲将最低位拆分,只需对10进行求模运算a%10,拆分次低位首先要想办法将原来的次低位作为最低位来处理,用原数对10求商可得到由除最低位之外的数形成的新数,且新数的最低位是原数的次低位,根据拆分最低位的方法将次低位求出a/10、a%10,对于其他位上的数算法相同。

    利用这个方法要解决的一个问题就是,什么情况下才算把所有数都拆分完?当拆分到只剩原数最高位时(即新数为个位数时),再对10求商的话,得到的结果肯定为0,可以通过这个条件判断是否拆分完毕。根据题意,应将每次拆分出来的数据存储到数组中,原数的最低位存到下标为0的位置,次低位存到下标为1的位置……依次类推。

    程序段如下:
    • for (i=0; a!=0; i++)
    • {
    •     m = a % 10;
    •     a /= 10;
    • }



    将数组中元素重新组合成一新数。拆分时变量a的最高位仍然存储在数组中下标最大的位置,根据“回文数”定义,新数中数据的顺序与a中数据的顺序相反,所以我们按照下标从大到小的顺序分别取出数组中的元素组成新数k,由几个数字组成一个新数时只需用每一个数字乘以所在位置对应的权值然后相加即可,在编程过程中应该有一个变量t来存储每一位对应的权值,个位权值为1,十位权值为10,百位权值为100……,所以可以利用循环,每循环一次t的值就扩大10倍。对应程序段如下:
    • for( ; i>0; i--)
    • {
    •     k += m[i-l] * t;
    •     t *= 10;
    • }



    下面是完整的代码:



    #include<stdio.h>
    int main()
    {
        int m[16], n, i, t, count=0;
        long unsigned a, k;
        printf("No.    number     it's square(palindrome)\n");
        for( n=1; n<256; n++ )  /*穷举n的取值范围*/
        {
            k=0; t=1; a=n*n;  /*计算n的平方*/
            for( i=0; a!=0; i++ )  /*从低到高分解数a的每一位存于数组m[1]~m[16]*/
            {
                m[i] = a % 10;
                a /= 10;
            }
            for(; i>0; i--)
            {
                k += m[i-1] * t;  /*t记录某一位置对应的权值 */
                t *= 10;
            }
            if(k == n*n)
                printf("%2d%10d%10d\n", ++count, n, n*n);
        }
        return 0;
    }




    运行结果:
    新建位图图像.bmp
    温馨提示:
    1、在论坛里发表的文章仅代表作者本人的观点,与本网站立场无关。
    2、论坛的所有内容都不保证其准确性,有效性,时间性。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
    3、根据二○○二年一月一日《计算机软件保护条例》规定:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬!鉴于此,也希望大家按此说明研究软件!谢谢
    4、若因线路及非本站所能控制范围的故障导致暂停服务期间造成的一切不便与损失,论坛不负任何责任。
    5、注册会员通过任何手段和方法针对论坛进行破坏,我们有权对其行为作出处理。并保留进一步追究其责任的权利。
    6、本站所有资源来自互联网,版权归原作者所有,所有资源仅供于学习、交流研究,请于下载24小时之后删除!
    7、当您在浏览本站时,发现有您自己创作的原创资源时侵犯了您的合法资源时,请您及时联系管理员,邮箱:2550721739@qq.com,我们会及时处理!
    今天天气真好啊!       
    您需要登录后才可以回帖 登录 | 立即注册 微信登录

    本版积分规则