关于列出完数的优化探讨!
列出完数 Time Limit: 1 Second(s) Memory Limit: 32 MB
Total Submission(s): 471 Accepted Submission(s): 147
Problem Description 自然数中,完数寥若晨星,请在从1到某个整数范围中打印出所有的完数来。所谓“完数”是指一个数恰好等于它的所有不同因子之和。例如,6是完数,因为6=1+2+3。而24不是完数,因为24≠1+2+3+4+6+8+12=36。
Input输入数据中含有一些整数n(1<n<10000)。
Output对于每个整数n,输出所有不大于n的完数。每个整数n的输出由n引导,跟上冒号,然后是由空格开道的一个个完数,每个n的完数列表应占独立的一行。若不存在完数,则输出" NULL"
Sample Input
100
5000
5
Sample Output
100: 6 28
5000: 6 28 496
5: NULL
在下不才,写了一个关于完数的程序,但是感觉这个程序算法的复杂度较高,想和大家探讨下,有没有更高效的算法。谢谢!
#include<stdio.h>
int method(int x)
{
int i,s=0;
for(i=1;i<=x/2;i++)
{ if(x%i==0)
{
s=s+i;
}
}
if(s==x)
return x;
else
return 0;
}
int main()
{
int n,i,s,a[6],j,h;
while (scanf("%d",&n)!=EOF)
{
j=1;
for(i=2;i<=n;i++)
{
s=method(i);
if(s!=0)
{
a[j]=s;
j++;
}
}
if(j==1)
printf("%d: %s",n,"NULL");
else
{
printf("%d: ",n);
for(h=1;h<j-1;h++)
{
printf("%d ",a[h]);
}
printf("%d",a[j-1]);
}
}
return 0;
}