100c之27:自守数
问题
自守数是指一个数的平方的尾数等于该数自身的自然数。例如: 25×25=625; 76×76=5776 ; 9376×9376 = 87909376,求20000000以内的自守数*
分析
不能使用穷举,因为会超过计算机表示的范围,而且此题也有一定的技巧性,比如最有可能成为自守数的是以1, 5, 6结尾的自然数。以其他数结尾的自然数不可能成为自守数。 所以只需要计算出该数平方的后几位数即可,不需要全部都计算。 比如以76的平方为例, 决定其乘积后两位的是76和6乘积的后两位以及76和7乘积的后一位。比如76×6=456, 76×7=672, 456和672错位相加 5和2相加得得到76平方的十位数7, 个位数由 6×6的个位数决定。
解决方案
1: /** 2: * @file 027c.c 3: * @author Chaolong Zhang <emacsun@163.com> 4: * @date Tue May 28 19:55:46 2013 5: * 6: * @brief 7: * 8: * 9: */ 10: 11: #include <stdio.h> 12: #include <math.h> 13: 14: int get_digits ( int number ); //get the number of digits 15: 16: int main(int argc, char *argv[]) 17: { 18: int number,digits; 19: for (number=0; number < 20000000; ++number) 20: { 21: int temp=0; 22: if (number%10/5 == 1 || number%10/6 ==1 ) 23: { 24: digits = get_digits( number ); 25: for (int i = 1; i <=digits; ++i) 26: temp += number * ( number/ ( int )pow( 10, i-1 )%10 ) % ( int )pow( 10 ,digits -i +1 ) * ( int ) pow( 10, i-1 ); 27: if (temp% ( int ) pow( 10, digits )== number) 28: printf ("%d \n",number); 29: } 30: } 31: return 0; 32: } 33: 34: 35: int get_digits ( int number ) 36: { 37: int i=1; 38: 39: while( ( number = number/ 10 ) > 0 ) i++; 40: return i; 41: }
最后运行结果
5 6 25 76 376 625 9376 90625 109376 890625 2890625 7109376 12890625
0 和 1没有算出来,这是因为在程序中设置了过滤只考察了尾数为5和6的自然数,实际上很容易证明尾数为0和1的数也只有0和1为自守数。
作者:emacsun
出处:http://www.cnblogs.com/chaolong/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。