完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
如果一个数恰好等于它的因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。截至2018年,相关研究者已经找到51个完全数。
#include<stdio.h>
#include<math.h>
int perfect(int n)//完数检测函数
{
{
int x=sqrt(n);
int i,sum;
for(i=2,sum=1;i<=x;i++)//搜索因子
{
if(n%i==0)
{
sum+=n/i+i;
}
}
if(sum==n)//判断是否为完数
{
printf("\n%d its factors are 1",sum);
for(i=2;i<=(n/2);i++)
{
if(n%i==0)//输出完数因子
{
printf(",%d",i);
}
}
}
}
return 0;
}
int main()
{
int m,j;
printf("输入寻找范围:");
scanf("%d",&m);
for(j=2;j<=m;j++)//搜索完数的范围
{
perfect(j);
}
return 0;
}
示例:
输入1000000
输出:6 its factors are 1,2,3
28 its factors are 1,2,4,7,14
496 its factors are 1,2,4,8,16,31,62,124,248
8128 its factors are 1,2,4,8,16,32,64,127,254,508,1016,2032,4064
本算法是在已知完数是偶数的基础上,如果要遍历所以数,包括奇数,速度将会慢一倍。该算法还可以进一步优化
for(i=2,sum=1;i<=x;i++)//搜索因子
{
if(n%i==0)
{
sum+=n/i+i;
if(sum>i)
{
continue;//加快速度,排除非完数
}
}
}
再放一个不定义函数的
#include<stdio.h>
#include<math.h>
int main()
{
int m,j,k=0;
printf("输入寻找范围:");
scanf("%d",&m);
for(j=2;j<=m;j++)//搜索完数的范围
{
int x=sqrt(j);
int i,sum;
for(i=2,sum=1;i<=x;i++)//搜索因子
{
if(j%i==0)
{
sum+=j/i+i;
if(sum>i)
{
continue;
}
}
}
if(sum==j)//判断是否为完数
{
k++;
printf("%d its factors are 1",sum);
for(i=2;i<=(j/2);i++)
{
if(j%i==0)//输出完数因子
{
printf(",%d",i);
}
}
printf("\n");
}
}
printf("共有%d个完数",k);
return 0;
}
发现不定义函数运行会比定义函数慢