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为自守数。

posted @ 2013-05-28 22:08  emacsun  阅读(1022)  评论(0编辑  收藏  举报