没事的时候,喜欢自己写写小的程序,以此给自己带来一些乐趣。今天看到完全数,从定义,历史了解了一下。发现完全数也是一个很好玩的数据。
完全数又称完美数,完备数。它是一个特殊的自然数,它的特殊性在:它所有的因子(不包含它本身)之和恰好等于其本身。对于完全数的研究从古时候就开始了,至今发现的完全数有47个,而且这47个数还都是偶数小于10^300。根据数学家的推算,完全数存在奇数,不过这个数会很大,并且要求会很苛刻。完全数也有一些性质:比如 1.每个都是调和数,即它们的每个因子的倒数之和都是2,因此完全数一定是调和数;2.完全数都是以6或8结尾等等吧。
一下是随便写的代码:
1 #include <stdio.h>2 #include <stdlib.h>
3 #include <math.h>
4 #include <stdbool.h>
5
6 #define MAX 10000
7
8 bool is_perfact_number(unsigned int num);
9
10 int main(void)
11 {
12 unsigned int i;
13 printf("Print all the perfact numbers(0 ~ %d): \n", MAX);
14 for (i = 6; i < MAX; i++, i++) /* perfact number is odd number(below 10 ^ 300)*/
15 {
16 if (is_perfact_number(i))
17 {
18 printf("The perfact numbers: %d\t", i);
19 putchar('\n');
20 }
21 }
22 return 0;
23 }
24
25 bool is_perfact_number(unsigned int num)
26 {
27 if ((num % 10 != 6 && num % 10 != 8))
28 return false; /* Perfact numbers must be the number of end of 6 or 8. */
29 int tmp = num;
30 int sum = 0;
31 int sq = (int)sqrt((double)tmp);
32 while (sq)
33 {
34 if (!(tmp % sq))
35 {
36 sum += sq;
37 if (tmp / sq != num)
38 sum += tmp / sq;
39 }
40 sq--;
41
42 }
43 if (sum == num)
44 return true;
45 return false;
46 }