C语言完数搜索程序

完全数(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;
}

发现不定义函数运行会比定义函数慢

猜你喜欢

转载自blog.csdn.net/Karthus77/article/details/109263100
今日推荐