首页 > 试题广场 >

完数VS盈数

[编程题]完数VS盈数
  • 热度指数:34118 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。

输入描述:
题目没有任何输入。


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

输入

输出

按题目要求进行输出即可。

python solution:

def judge(n):
    res = []
    for i in range(1, n):
        if n % i == 0: res.append(i)
    return sum(res) - n


E, G = [], []
for i in range(2, 61):
    if judge(i) > 0:
        G.append(str(i))
    elif judge(i) == 0:
        E.append(str(i))
print("E: " + " ".join(E))
print("G: " + " ".join(G))
发表于 2017-10-03 21:49:10 回复(1)
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;

// 判断一个数是否为完数
// return 1 : 完数
// return 0 : 盈数
// return -1: 其他
int solve(int num)
{
    int sum = 0;
    for(int i = 1; i < num; ++i)
    {
        if(num % i == 0)
        {
            sum += i;
        }
    }
    if(sum == num) {
        return 1;       // 相等为完数
    }
    if(sum > num) {
        return 0;       // 大于为盈数
    }
    return -1;          // 其他情况
}

int main()
{

    vector<int> ve;     // 完数
    vector<int> vg;     // 盈数

    // 判断2 - 60
    for(int i = 2; i <= 60; ++i)
    {
        if(solve(i) == 1)
        {
            ve.push_back(i);    // 完数
        }
        else if(solve(i) == 0)
        {
            vg.push_back(i);    // 盈数
        }
    }

    // 输出
    cout << "E: ";
    for(int i = 0; i < ve.size(); ++i)
    {
        if(i != 0) {
            cout << " ";
        }
        cout << ve[i];
    }
    cout << endl;
    cout << "G: ";
    for(int i = 0; i < vg.size(); ++i)
    {
        if(i != 0) {
            cout << " ";
        }
        cout << vg[i];
    }
    return 0;
}


发表于 2016-08-01 11:15:08 回复(0)
//AC代码,但求因子应该有更好地方法
#include <iostream>
#include <vector>
#include <math.h>
using namespace std;
int main(){
    vector<int> a,b;
    int i;
    for(int num=2;num<=60;num++){
        int sum=1;
        for(i=2;i<num;i++){            
            if(num%i==0){                
                sum+=i;                
            }
        }        
        if(sum==num) a.push_back(num);
        else if(sum>num) b.push_back(num);        
    }   
    cout<<"E: ";
    for(i=0;i<a.size()-1;i++)
        cout<<a[i]<<" ";
    cout<<a[a.size()-1]<<endl;
    cout<<"G: ";
    for(i=0;i<b.size()-1;i++)
        cout<<b[i]<<" ";
    cout<<b[b.size()-1]<<endl;
    return 0;
}
发表于 2017-12-12 12:58:37 回复(2)
#include<stdio.h>
#include<math.h>
int judge(int n)
{
    int i;
    int num=0;
    for(i=1;i<n;i++)
    {
        if(n%i==0)
            num+=i;
    }
    if(num==n) return 1;
    else if(num>n)  return 2;
    else return 0;
}

int main()
{
    int i,k;
    int a[60];
    int r=0,t=59;
    for(i=2;i<=60;i++)
    {
        k=judge(i);
        if(k==1)
            a[r++]=i;
        if(k==2)
            a[t--]=i;
    }
    printf("E:");
    for(i=0;i<r;i++)
        printf(" %d",a[i]);
    printf("\nG:");
    for(i=59;i>t;i--)
        printf(" %d",a[i]);
    return 0;
}

发表于 2017-02-23 10:35:46 回复(0)
先打表记录2~60各个数的因子之和,然后依次遍历各数与其因子之和的大小关系,判断完数 or 盈数 or 非完数且非盈数,注意输出格式。
#include <stdio.h>
#include <math.h>
int e[65],eans=0;
int g[65],gans=0;
int factorsum[65]={0};
void Solve(){
    int i,j;
    for(i=2;i<=60;i++){
        for(j=1;j<=i/2;j++){
            if(i%j==0)
                factorsum[i]+=j;
        }
    }
}
int main(){
    int i;
    Solve();
    for(i=2;i<=60;i++){
        if(i==factorsum[i])
            e[eans++]=i;
        else if(i<factorsum[i])
            g[gans++]=i;
    }
    printf("E: ");
    for(i=0;i<eans-1;i++)
        printf("%d ",e[i]);
    printf("%d\n",e[eans-1]);
    printf("G: ");
    for(i=0;i<gans-1;i++)
        printf("%d ",g[i]);
    printf("%d\n",g[gans-1]);
    return 0;
}

发表于 2019-01-02 08:40:57 回复(0)
#include<iostream>
using namespace std;
#include<vector>
/*完数与盈数*/
int main()
{
	vector<int> E, G;
	for (int i = 2; i <= 60; i++)
	{
		int sum = 0;
		for (int j = 1; j < i; j++)//因子
			if (i % j == 0)
				sum += j;
		
		if (sum == i)
			E.push_back(i);
		else if(sum > i)
			G.push_back(i);
	}
	//输出
	vector<int>::iterator it;
	cout << "E:";
	for ( it = E.begin(); it != E.end(); it++)
			cout << " "<< *it;
	cout << endl;
	cout << "G:";
	for (it = G.begin(); it != G.end(); it++)
			cout << " "<< *it ;
	return 0;
}

竟然是数之前有个空格,被坑了
编辑于 2020-04-20 12:54:48 回复(0)
Java 解法
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> g = new ArrayList<>();
        ArrayList<Integer> e = new ArrayList<>();
        for (int i = 2; i <= 60; i++) {
            int sum=0;
            for (int j = 1; j < i; j++) if (i%j==0) sum+= j;
            if (sum==i) e.add(i);
            else if (sum>i) g.add(i);
        }
        System.out.print("E: ");
        for (Integer i : e) System.out.print(i+" ");
        System.out.println();
        System.out.print("G: ");
        for (Integer i : g) System.out.print(i+" ");
        
    }
}


发表于 2020-03-18 11:36:33 回复(0)
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <cstring>
using namespace std;
int main(void)
{
    int num_a,num_b,sum,i,j;
    int a[60],b[60];
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    num_a=num_b=0;
    for(i=2;i<=60;i++)
    {
        sum=0;
        for(j=1;j<=(i/2);j++)
            if(i%j==0)
                sum+=j;
        if(i==sum&&i<60)
        {
            a[num_a]=i;
            num_a++;
        }
        if(i<sum)
        {
            b[num_b]=i;
            num_b++;
        }
    }
    cout<<"E:";
    for(i=0;i<60;i++)
        if(a[i]==0)
            break;
        else
            cout<<" "<<a[i];
    cout<<endl;
    cout<<"G:";
    for(i=0;i<60;i++)
        if(b[i]==0)
            break;
        else
            cout<<" "<<b[i];
    return 0;
}
发表于 2019-11-16 23:21:56 回复(0)
#include<bits/stdc++.h>
int main(){
    int a[61]={0};
    for(int i=2;i<61;i++){
        int l=sqrt(i),sum=0;
        for(int j=1;j<=l;j++)
            if(i%j==0)
                sum=sum+j+i/j;
        if(i==l*l) sum=sum-l;
        if(sum>2*i) a[i]=1;
        else if(sum==2*i) a[i]=2;
    }
    printf("E: ");
    for(int i=2;i<61;i++)
        if(a[i]==2)
            printf("%d ",i);
    printf("\n");
    printf("G: ");
    for(int i=2;i<61;i++)
        if(a[i]==1)
            printf("%d ",i);
    printf("\n");
}
发表于 2019-03-15 16:42:48 回复(0)
def getFactorSum(num):
    result = 0
    for i in range(num//2,0,-1):
        if num % i == 0:
            result += i
    return result
for i in range(2, 61):
    if getFactorSum(i) == i:
        e.append(i)
    elif getFactorSum(i) > i:
        g.append(i)
print('E: ', end="")
print(' '.join(map(str, e)))
print('G: ', end="")
print(' '.join(map(str, g)))
编辑于 2018-10-09 23:50:44 回复(0)
#include<iostream>
using namespace std;
int main()
{
    int a[61];
    fill(a,a+61,0);
    for(int i=2;i<61;i++)
    {
        int sum=1;
        for(int j=2;j<i;j++)
        {
            if(i%j==0)    sum+=j;
        }
        if(sum==i)  a[i]=1;
        if(sum>i)  a[i]=2;
    }
    cout<<"E:";
    for(int i=2;i<61;i++)
    {
        if(a[i]==1)  cout<<' '<<i;
    }
    cout<<endl<<"G:";
    for(int i=2;i<61;i++)
    {
        if(a[i]==2)  cout<<' '<<i;
    }
}


编辑于 2018-08-15 16:48:52 回复(0)
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
int perfect(int n)
{
    int sum = 1;
    for(int i = 2; i <= sqrt(n); i++)
    {
        if((n % i == 0) && (i * i != n))
        {
            sum = sum + i + n / i;
        }
        if(n % i == 0 && i * i == n)
        {
            sum = sum + i;
        }
    }
    return sum;
}
int main()
{
    vector<int> v1, v2;
    for(int i = 2; i <=60; i++)
    {
        if(perfect(i) == i)
            v1.push_back(i);
        if(perfect(i) > i)
            v2.push_back(i);
    }
    cout << "E: ";
    for(int i = 0; i < v1.size() - 1; i++)
        cout << v1[i] << " ";
    cout << v1[v1.size()-1] << endl;
    cout << "G: ";
    for(int i = 0; i < v2.size() - 1; i++)
        cout << v2[i] << " ";
    cout << v2[v2.size()-1] << endl;
    return 0;
}

发表于 2018-07-25 16:41:34 回复(0)
#include<stdio.h>
#include<math.h>
int main()
{
    int E[60],G[60],b[60],i=2,k,sum,p=0,r=0,m;
    while(i<=60)
    {
        m=0;
        sum=1;
        for(k=2;k<=sqrt(i);k++)
        if(i%k==0)
            if(k<sqrt(i))
        {
            b[m]=k;
            b[m+1]=i/k;
            m+=2;
        }
            else
        {
            b[m]=k;
            m+=1;
        }
        for(k=0;k<m;k++)
            sum+=b[k];
        if(sum==i)
        {
            E[p]=i;
            p++;
        }
        else if(sum>i)
        {
            G[r]=i;
            r++;
        }
        i++;
    }
    printf("E: ");
    for(i=0;i<p-1;i++)
        printf("%d ",E[i]);
    printf("%d\n",E[i]);
    printf("G: ");
    for(i=0;i<r-1;i++)
        printf("%d ",G[i]);
    printf("%d\n",G[i]);
    return 0;
}
发表于 2018-02-25 16:34:58 回复(0)

可惜java没有c++的vector轻便

package com.speical.first;


/** 
* 完数和盈数
*
* @author special
* @date 2017年12月22日 下午10:59:03
*/
public class Pro19 {
    public static int check(int num){
        int sum = 1;
        for(int i = 2; i <= Math.sqrt(num); i++){
            if(num % i == 0){
                sum += i;
                if(num / i != i){
                    sum += num / i;
                }
                if(sum > num){
                    return 1;
                }
            }
        }
        if(sum == num) return 0;
        else return -1;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] E = new int[60];
        int[] G = new int[60];
        int indexE = 0;
        int indexG = 0;
        for(int i = 2; i <= 60; i++){
            if(check(i) == 0){
                E[indexE++] = i;
            }else if(check(i) == 1){
                G[indexG++] = i;
            }
        }
        System.out.print("E:");
        for(int i = 0; i < indexE; i++){
            System.out.print(" " + E[i]);
        }
        System.out.print("\nG:");
        for(int i = 0; i < indexG; i++){
            System.out.print(" " + G[i]);
        }
        System.out.println();
    }

}
发表于 2017-12-22 23:23:40 回复(0)
亘头像

package NiuKeBianMa;

import java.util.ArrayList;
import java.util.List;

public class Main40 {

public static boolean wan(int n) {
    List list =new ArrayList();
    for(int i=1;i<n;i++) {
        if(n%i==0) {
            list.add(i);
        }
        }
    int count =0;
        for(int i:list) {
            count+=i;
        }
        if(n==count) {
            return true;
        }
    return false;
}
public static boolean ying(int n) {
    List list =new ArrayList();
    for(int i=1;i<n;i++) {
        if(n%i==0) {
            list.add(i);
        }
        }
    int count =0;
        for(int i:list) {
            count+=i;
        }
        if(n<count) {
            return true;
        }
    return false;
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    List list = new ArrayList();
    List list2 = new ArrayList();
    for (int i = 2; i <= 60; i++) {
        if (wan(i) == true) {
            list.add(i);
        } else if (ying(i) == true) {
            list2.add(i);
        }
    }
    System.out.print("E: ");
    for (int i = 0; i < list.size() - 1; i++) {
        System.out.print(list.get(i) + " ");

    }
    System.out.println(list.get(list.size() - 1));
    System.out.print("G: ");
    for (int i = 0; i < list2.size() - 1; i++) {
        System.out.print(list2.get(i) + " ");
    }
    System.out.print(list2.get(list2.size() - 1));
}

}

发表于 2017-11-19 22:36:14 回复(0)
#include <iostream>
using namespace std;

int main() {
int judge[61];
    int sum = 1;
    for (int i = 2; i <= 60; i++) {
        for (int j = 2; j < i; j++) {
            if (i % j == 0) {
                sum += j;
            }
        }
        if (sum == i) {
            judge[i] = 1;
        }
        else if(sum > i) {
            judge[i] = 0;
        }
        else {
            judge[i] = -1;
        }
        sum = 1;
    }
    cout << "E:";
    for (int i = 2; i <= 60; i++) {
        if (judge[i] == 1) {
            cout << " " << i ;
        }
    }
    cout << endl << "G:";
    for (int i = 2; i <= 60; i++) {
        if (judge[i] == 0) {
            cout << " " << i ;
        }
    }
    cout << endl;
}



发表于 2016-06-04 12:04:19 回复(0)
#include<stdio.h>
int main(){
	printf("E: 6 28\nG: 12 18 20 24 30 36 40 42 48 54 56 60");
}

发表于 2017-08-04 08:51:46 回复(17)
#include<stdio.h>//找到除掉本身的因子相加,判断是否等于本身
int main()
{
    int w=0,y=0,i,j,E[60],G[60],yinzihe[60];
    for(i=2;i<=60;i++)//1-60被除数
    {
        yinzihe[i]=0;
        for(j=1;j<i;j++)//除数不包含i
            if(i%j==0)//是因子
                yinzihe[i]+=j;//被除数的因子和   
        if(yinzihe[i]==i)
        {
            E[w]=i;
            w++;//完数下标
        }
        if(yinzihe[i]>i)
        {
            G[y]=i;
            y++;//盈数下标
        }
    }
    printf("E: ");//输出
    for(i=0;i<w;i++) printf("%d ",E[i]);
    printf("\nG: ");
    for(i=0;i<y;i++) printf("%d ",G[i]);
}

编辑于 2020-03-21 16:54:55 回复(0)
因子遍历到sqrt(n)即可,n=1*n,n不算,所以因子1单独处理。

#include<iostream>
using namespace std;
int main(){
	int e[60],g[60];
	int eflag=0,gflag=0;
	for(int n=2;n<=60;n++){
		int i,sum=1; 
		for( i=2;i*i<n;i++){
			if(n%i==0){
				sum=sum+i+n/i;
			}
		}
		if(i*i==n){
			sum+=i;
		}
		
		if(n==sum){
			e[eflag++]=n;
		}
		else if(sum>n){
			g[gflag++]=n;
		}
	}
	cout<<"E:";
	for(int i=0;i<eflag;i++){
		cout<<" "<<e[i];
	}
	cout<<endl;
	cout<<"G:";
	for(int i=0;i<gflag;i++){
		cout<<" "<<g[i];
	}
}


发表于 2020-03-16 10:40:25 回复(0)
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>

using namespace std;

vector<int> E;
vector<int> G;

int sum(int x);

int main(){
	for (int i = 2; i <=60; i++) {
		if (i == sum(i)) {
			E.push_back(i);
		}
		if (i < sum(i)) {
			G.push_back(i);
		}
	}
	
	printf("E:");
	for (int i = 0; i < E.size(); i++){
		printf(" %d", E[i]);
	}
	printf("\n");
	
	printf("G:");
	for (int i = 0; i < G.size(); i++){
		printf(" %d", G[i]);
	}
	
	return 0;
}

int sum(int x){
	int sum = 0;
	for (int i = 1; i < x; i++){
		if (x % i == 0) {
			sum += i;
		}
	}
	return sum;
}

发表于 2023-03-22 19:53:44 回复(0)

问题信息

难度:
145条回答 10491浏览

热门推荐

通过挑战的用户

查看代码