求1000以内的所有完数
#include<stdio.h>void main()
{
int n,i,s=0;
for(n=2;n<1000;n++)
{
for(i=1;i<n;i++)
if(n%i==0)
s=s+i;
if(s==n)
{
printf("%d=",n);
for(i=1;i<n;i++)
if(n%i==0)
printf("%d+",i);
}
}
}
哪里错了?求大神。。。
这是你的方法只不过效率低了点#include<stdio.h>
int main()
{
int i,j,s=0;
for(i = 6;i<=1000;++i)
{
for(j = 1;j<i;++j)
{
if(i%j==0)
{
s+=j;
}
}
if(s==i)
{
printf("%d\n",i);
}
s=0;
}
return 0;
} 本帖最后由 牡丹花下死做鬼 于 2014-2-5 21:42 编辑
#include<stdio.h>
#include<math.h>
int isWqs(int i);
int main()
{
int i;
for(i = 6;i<=1000;i++)//遍历最小的是6
{
if(isWqs(i) == 1)//如果是完数就输出
{
printf("%d\n",i);
}
}
return 0;
}
int isWqs(int i)
{
int j,k,t,sum;
int y;
y=1;
k = 1;//应为1肯定是因子所以直接加上去了
sum = 1;//1默认有了
for(j = 2;j<=sqrt(i);++j)
{
if(i%j==0)//如果能整除 那么 j 和 i/j 都是因子
{
y=j;
k++;
y=i/j;
k++;
}
}
t = sqrt(i);
if(t*t == i)//如果是完全平方数那么最后两个是一样的
{
k=k-2;
}
else
{
k--;
}
for(j=1;j<=k;++j)//把真因子加起来
{
sum += y;
}
if(sum == i)//判断真因子之和与原数字
{
return 1;
}
else
{
return 0;
}
}
那个验证是不是完数 你也可以简单点但效率低点就像你一个一个试过去
不过你忘了一件事每次加完一个数的因子后 要写 s=0; 你漏了
页:
[1]