liwenhao96 发表于 2014-2-5 20:16:30

求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);
                        }
        }
}
哪里错了?求大神。。。


牡丹花下死做鬼 发表于 2014-2-5 20:16:31

这是你的方法只不过效率低了点#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:16:31

本帖最后由 牡丹花下死做鬼 于 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;
        }
}



牡丹花下死做鬼 发表于 2014-2-5 21:20:59

那个验证是不是完数 你也可以简单点但效率低点就像你一个一个试过去
不过你忘了一件事每次加完一个数的因子后 要写 s=0; 你漏了
页: [1]
查看完整版本: 求1000以内的所有完数