网站规划与开发设计,网站建设家居,云开发环境,营销型网站建设便宜1、问题描述
打印所有不超过n#xff08;取n256#xff09;的其平方具有对称性质的数#xff08;也称回文数#xff09;。
2、问题分析
对于要判定的数n计算出其平方后#xff08;存于a#xff09;#xff0c;按照“回文数”的定义要将最高位与最低位、次高位与次…1、问题描述
打印所有不超过n取n256的其平方具有对称性质的数也称回文数。
2、问题分析
对于要判定的数n计算出其平方后存于a按照“回文数”的定义要将最高位与最低位、次高位与次低位……进行比较若彼此相等则为回文数。此算法需要知道平方数的位数再一一将每一位分解、比较此方法对于位数已知且位数不是太多的数来说比较适用。 此问题可借助数组来解决。将平方后的a的每一位进行分解按从低位到高位的顺序依次暂存到数组中再将数组中的元素按照下标从大到小的顺序重新将其组合成一个数众如n15则a225且k522若k等于n×n则可判定n为回文数。
3、算法设计
从低位到高位将某一整数拆分。对于一个整数设变量名为a无论其位数多少若欲将最低位拆分只需对10进行求模运算a%10拆分次低位首先要想办法将原来的次低位作为最低位来处理用原数对10求商可得到由除最低位之外的数形成的新数且新数的最低位是原数的次低位根据拆分最低位的方法将次低位求出a/10、a%10对于其他位上的数算法相同。 利用这个方法要解决的一个问题就是什么情况下才算把所有数都拆分完当拆分到只剩原数最高位时即新数为个位数时再对10求商的话得到的结果肯定为0可以通过这个条件判断是否拆分完毕。根据题意应将每次拆分出来的数据存储到数组中原数的最低位存到下标为0的位置次低位存到下标为1的位置……依次类推。 程序段如下 for (i0; a!0; i) { m[i] a % 10; a / 10; } 将数组中元素重新组合成一新数。拆分时变量a的最高位仍然存储在数组中下标最大的位置根据“回文数”定义新数中数据的顺序与a中数据的顺序相反所以我们按照下标从大到小的顺序分别取出数组中的元素组成新数k由几个数字组成一个新数时只需用每一个数字乘以所在位置对应的权值然后相加即可在编程过程中应该有一个变量t来存储每一位对应的权值个位权值为1十位权值为10百位权值为100……所以可以利用循环每循环一次t的值就扩大10倍。对应程序段如下 for( ; i0; i--) { k m[i-l] * t; t * 10; } 下面是完整的代码 #includestdio.h int main() { int m[16], n, i, t, count0; long unsigned a, k; printf(No. number its square(palindrome)\n); for( n1; n256; n ) /*穷举n的取值范围*/ { k0; t1; an*n; /*计算n的平方*/ for( i0; a!0; i ) /*从低到高分解数a的每一位存于数组m[1]~m[16]*/ { m[i] a % 10; a / 10; } for(; i0; 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 its square(palindrome)1 1 12 2 43 3 94 11 1215 22 4846 26 6767 101 102018 111 123219 121 14641
10 202 40804
11 212 44944