欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

完数VS盈数

程序员文章站 2024-03-21 20:17:04
...

题目描述

一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。

输入描述:

题目没有任何输入。

输出描述:

输出2到60之间所有“完数”和“盈数”,并以如下形式输出:
E: e1 e2 e3 ......(ei为完数)
G: g1 g2 g3 ......(gi为盈数)
其中两个数之间要有空格,行尾不加空格。

示例1

输入

 

输出

这道题目我很无语,我写的代码运行可能通过在牛客上就是通过不了,我看了别人的分析,和我写的差不多,不知道哪里出的问题。如果有看出来的,麻烦提醒一下,感谢。

我的代码:

#include<stdio.h>
int main(){
	int i,j;
	int a[60];
	int b[60];
	int m=0,n=0;
	for(i=2;i<=60;i++){
		int sum=0;
		for(j=1;j<i;j++){
			if(i%j==0)
			sum=sum+j;
		}
		if(sum>i){
		a[m]=i;
		m++;
		}
		else if(sum==i){
			b[n]=i;
			n++;
		}
	}
	printf("E:");
	for(i=0;i<n;i++){
		printf("%d ",b[i]);
	}
	printf("\nG:");
	for(i=0;i<m;i++){
		printf("%d ",a[i]);
	}
	return 0;
}

上面的代码不能ac,但是我找不到原因。

下面是能够ac的代码:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int e[60], g[60];
    int e_size = 0, g_size = 0;
    int i, j, sum;
    for (i=2; i<=60; i++)
    {
        sum = 0;
        for(j=1; j<i; j++)
        {
            if (i%j == 0)
                sum += j;
        }
        if (sum > i)
            g[g_size++] = i;
        else if (sum == i)
            e[e_size++] = i;
    }
    printf("E:");
    for(i=0; i<e_size; i++)
        printf(" %d", e[i]);
    printf("\nG:");
    for(i=0; i<g_size; i++)
        printf(" %d", g[i]);
    return 0;
}

当然还有陈独秀的代码

#include<stdio.h>
int main(){
    printf("E: 6 28\nG: 12 18 20 24 30 36 40 42 48 54 56 60");
}

 

上一篇: MySQL复制一个数据库

下一篇: 1