1000以内的完数,麻烦请看清题目和题目要求,拜托啦,代码改了好久,请大神帮忙改下代码,题目如下

问题 O: 1000以内的完数
题目描述
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程 找出1000以内的所有完数。
输入
一个sum (sum < 1000) ,表示测试数据的组数,接着sum行,每一行表示一个测试数据n,表示要求1到n以内的完数,1在这里不算是完数。

输出
范围内的完数,如果范围内没有完数请输出none,每组测试数据空出一行(如果完数有多个,每个数字后面都输出空格)。

样例输入
2
1
6
样例输出
none
6
提示
不要妄想输出答案。

my wrong:
#include
int main()
{
int n,i,sum,j,k,m;
scanf("%d",&j);
sum=0;
for(k=0; k<j; k++)
{
scanf("%d",&n);
for(m=1; m<n; m++)
{
for(i=1; i<m; i++)
{
if(m%i==0)
sum=i+sum;
}
}
if(sum==m)
{
printf("%d ",sum);
}

    if(sum==0)
    {
        printf("none\n");
    }
}

}

个人思路:
1:先找出1000以内所有的数的因子,保存
2:在计算这些数的因子的和是否相等于这个数,判断是否是完数

 #include <stdio.h>
#include <Math.h>
bool matchNum(int num);
void main()
{
    for (int i = 0; i < 1000; i++)
    {
        if (matchNum(i))
        {
            printf("%d\n", i);
        }
    }
}
bool matchNum(int num)
{
    int k = sqrt(num);
    int sum = 1;
    for (int i = 2; i <= k; i++)
    {
        if (num%i == 0)
        {
            sum += i;
            if (num / i != i)
            {
                sum += num / i;
            }

        }
    }
    return sum == num;

}

简单 如果用C语言几个for循环就可以解决 主要是逻辑思想

 #include"stdio.h"
#include"malloc.h"
int main()
{
    int *n,i,sum=0,j,k,m;
    scanf("%d",&j);
    n=(int*)malloc(4*1000);//假设行数在1000之内
    for(k=0; k<j; k++)
    {
        n[k]=(int)malloc(4);
        scanf("%d",&n[k]);
    }
    for(k=0;k<j;k++)
    {
        sum=0;
        for(m=1; m<n[k]; m++)
        {
            for(i=1; i<m; i++)
            {
                if(m%i==0)
                    sum=i+sum;
            }
        }
        if(sum==n[k])
        {
            printf("%d ",sum);
        }
        else
        {
             printf("none\n");
        }
    }
return 0;
}

再贴一边

#include"stdio.h"
#include"malloc.h"
int main()
{
int n,i,sum=0,j,k,m;
scanf("%d",&j);
n=(int
)malloc(4*1000);//假设行数在1000之内
for(k=0; k<j; k++)
{

n[k]=(int)malloc(4);
scanf("%d",&n[k]);
}

for(k=0;k<j;k++)
{

sum=0;
for(m=1; m<n[k]; m++)
{
for(i=1; i<m; i++)
{
if(m%i==0)
sum=i+sum;
}
}
if(sum==n[k])
{
printf("%d ",sum);
}
else
{
printf("none\n");
}
}

}

 //这是经我优化的程序

#include
#include
bool matchNum(int num);
void main()
{
for (int i = 0; i < 1000; i++)
{
if (matchNum(i))
{
printf("%d\n", i);
}
}
}
bool matchNum(int num)
{
int k = sqrt(num);
int sum = 1;
for (int i = 2; i <= k; i++)
{
if (num%i == 0)
{
sum += i;
if (num / i != i)
{
sum += num / i;
}

    }
}
return sum == num;

}

你新建一个工程,贴入这段代码
public static void main(String[] args) {
for (int i = 2; i < 1000; i++) {
check(i);
}
}

private static void check(int i) {
    Set<Integer> set = new HashSet<Integer>();
    set.add(1);
    for (int j = 2, l = (int) Math.sqrt(i); j <= l; j++) {
        if (i % j == 0) {
            set.add(j);
            set.add(i / j);
        }
    }
    int sum = 0;
    for (int j : set) {
        sum += j;
    }
    if (sum == i) {
        System.out.print(i + ": ");
        for (int j : set) {
            System.out.print(j + " ");
        }
        System.out.println();
    }
}
    希望对你有帮助