for (i=0; a!=0; i++) { m[i] = 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; }运行结果:
No. number it's square(palindrome) 1 1 1 2 2 4 3 3 9 4 11 121 5 22 484 6 26 676 7 101 10201 8 111 12321 9 121 14641 10 202 40804 11 212 44944
Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有