算法15---数论1---完全数
算法15---数论1---完全数
完全数是一些特殊的自然整数。完全数等于其所有因子之和。所谓因子是所有的可以整除这个数的数,而不包括这个数本身。
一些完全数的概念
(1)亏数:当一个自然数的所有因子之和小于该自然数,那么该自然数便是亏数;
(2)盈数:当一个自然数的所有因子之和大于该自然数,那么该自然数便是盈数;
(3)完全数:当一个自然数的所有因子之和等于该自然数,那么该自然数便是完全数;
相关的结论
1 每一个完全数都可以表示成连续自然数之和
2 每个完全数都是调和数;
若一个正整数n的所有因子的调和平均是整数,n便称为调和数(Harmonic number)。它又称欧尔数(Ore number)。
3 每一个完全数都可以表示为2的一些连续正整数次幂之和。
如:6=2+2²
4 已知的完全数都是以6或者8结尾。
5 除6以外的完全数都可以表示成连续奇立方之和。
如:28=1³+3³;
完全数的实现如下
1 /* 2 题目:完全数 3 author taoliu——alex 2016.10 4 5 */ 6 7 8 #include <stdio.h> 9 10 11 void perfectnum(int n) 12 { 13 14 int perfect[100]={0}; 15 int sum=0; 16 for (int i = 1; i < n; i++) 17 { 18 if (n%i==0) 19 { 20 perfect[i]=i; 21 sum=sum+i; 22 } 23 } 24 if (sum==n) 25 { 26 printf("the number %d is perfect number!\n",n); 27 printf("the number %d is made up as follow!\n",n); 28 for (int i = 0; i < 100; i++) 29 { 30 if (perfect[i]!=0) 31 { 32 printf("%d ", perfect[i]); 33 } 34 } 35 36 } 37 //else 38 // printf("%d is not perfect number!\n",n ); 39 40 41 } 42 43 int main() 44 { 45 46 47 //可以输入你想要判断的数字 48 /* 49 int n; 50 printf("please input the number you want to judge! \n"); 51 scanf("%d",&n); 52 perfectnum(n); 53 */ 54 //也可以输出在某一范围内的所有完全数 55 printf("please input the scope you want to find! \n"); 56 int scope; 57 scanf("%d",&scope); 58 59 for (int i = 1; i < scope; ++i) 60 { 61 perfectnum(i); 62 } 63 return 0; 64 65 }