28.回文数 打印所有不超过n(取n<256) 的其平方具有对称性质的数(也称回文数)。*题目分析与算法设计对于要判断的数n,计算出其平方后(存于a),将a的每一位进行分解,再按a的从低到高的顺序将其恢复成一个数k(如n=13,则a=169且k=961),若a等于k则可判定n为回亠数。*程序说明与注释原程序好像有错,而且比较费解,现基于原程序修改如下(如果读者还发现错误请提出): #include<stdio.h>int main(void){ 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[0]~m[16]*/ { m[i]=a%10;//这个是取得a的个位,整个循环合起来就可以取得各个位 a/=10; } int j=0; for(i--;j<i;j++,i--)//因为n的平方的各个位都存在数组中了,下面判断是不是对称 if(m[j]!=m[i])break;//只要有一位不是对称,那就说明不是对称,就可以退出了 //所有的位都对称就说明是对称了,这样就可以打印出结果了 if(j>=i)printf("%2d%10d%10d\n",++count,n,n*n); } return 0;}*运行结果No. number it's square(palindrome)1 1 12 2 43 3 94 11 1215 22 4846 26 6767 101 102018 111 123219 121 1464110 202 4080411 212 44944 //下面程序是原来的,有错,而且费解#include<stdio.h>int main(void){ 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=1;a!=0;i++) /*从低到高分解数a的每一位存于数组m[1]~m[16]*/ { m[i]=a%10;//安安注:这个是取得a的个位,整个循环合起来就可以取得各个位,并存于数组中,为了是下面判断是不是对称 a/=10; } for(;i>1;i--) { k+=m[i-1]*t; t*=10; } if(k==n*n) printf("%2d%10d%10d\n",++count,n,n*n); } return 0;} *运行结果No. number it's square(palindrome)1 1 12 2 43 3 94 11 1215 22 4846 26 6767 101 102018 111 123219 121 14641

评论