首页 > 试题广场 >

完数VS盈数

[编程题]完数VS盈数
  • 热度指数:34041 时间限制: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

输入

输出

按题目要求进行输出即可。
#include<stdio.h>
#include<vector>
using namespace std;
int Sum(int a){
    int sum=0;
    for(int i=1;i<a;i++){
        if(0==a%i){
            sum=sum+i;
        }
    }
    return sum;
}
int main(){
    vector<int> Evec;
    vector<int> Gvec;
    for(int i=2;i<=60;i++){
        if(Sum(i)==i){
            Evec.push_back(i);
        }
        else if(Sum(i)>i){
            Gvec.push_back(i);
        }
    }
    printf("E:");
    for(int i=0;i<Evec.size();i++){
        printf(" %d",Evec[i]);
    }
    printf("\nG:");
    for(int i=0;i<Gvec.size();i++){
        printf(" %d",Gvec[i]);
    }
}
//一个数如果恰好等于它的各因子(该数本身除外)子和,如:6=3+2+1。则称其为“完数”;若因子之和大于该数,则称其为“盈数”。 求出2到60之间所有“完数”和“盈数”。
//输出2到60之间所有“完数”和“盈数”,并以如下形式输出:
//E: e1 e2 e3 ......(ei为完数)
//G: g1 g2 g3 ......(gi为盈数) 其中两个数之间要有空格,行尾不加空格。

发表于 2023-02-28 21:34:46 回复(0)
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<vector>
using namespace std;

int main()
{
	vector<int> wanshu;
	vector<int> yingshu;
	for (int i = 2; i <= 60; i++)
	{
		vector<int> yinshu;
		for (int j = 1; j < i; j++)
		{
			if (i % j == 0)
				yinshu.push_back(j);
		}
		int sum=0;
		for (int m = 0; m < yinshu.size(); m++)
		{
			sum += yinshu[m];
		}
		if (sum == i)
			wanshu.push_back(i);
		else if (sum > i)
			yingshu.push_back(i);
	}
	printf("E:");
	for (int i = 0; i < wanshu.size(); i++)
	{
		printf(" %d", wanshu[i]);
	}
	printf("\nG:");
	for (int i = 0; i < yingshu.size(); i++)
	{
		printf(" %d", yingshu[i]);
	}
}

发表于 2023-02-15 15:53:28 回复(0)

这输出真有毒

#include <bits/stdc++.h>
using namespace std;
int isEnum(int n){
    int ans=0;
    for(int i=sqrt(n);i>1;i--){
        if(n%i==0){
            ans=ans+i+(i!=n/i? n/i:0);
        }
    }
    if(ans+1==n) return 1;
    else if(ans+1>n) return 2;
    else return 3;
}
void print(int a[],int len){
        for(int i=0;i<len;i++)
        cout<<' '<<a[i];
}
int main()
{
    int a[60]={0},b[60]={0},cnta=0,cntb=0;
    for(int i=2;i<=60;i++){
        switch(isEnum(i)){
            case 1:
                a[cnta++]=i;
                break;
            case 2:
                b[cntb++]=i;
                break;
            default:
                break;
        }
    }
    cout<<"E:";
    print(a,cnta);
    cout<<endl;
    cout<<"G:";
    print(b,cntb);
}
编辑于 2021-03-18 20:45:50 回复(0)
#include <stdio.h>

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

int main(){
    int e[60] = {0}, g[60] = {0};
    int j1 = 0, j2 = 0;
    for(int i = 2; i <= 60; i++){
        if(Sum(i) == i){
            e[j1++] = i;
        }else if(Sum(i) > i){
            g[j2++] = i;
        }
    }

    printf("E: ");
    for(int i = 0; i < j1; i++){
        printf("%d", e[i]);
        if(i != j1 - 1){
            printf(" ");
        }
    }
    printf("\n");

    printf("G: ");
    for(int i = 0; i < j2; i++){
        printf("%d", g[i]);
        if(i != j2 - 1){
            printf(" ");
        }
    }
    printf("\n");

    return 0;
}

发表于 2021-03-16 17:27:20 回复(0)
//单独写一个函数判断完数/盈数,返回1代表完数,返回-1代表盈数
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int isPerfectNumber(int x){
    int sum=0;
    for(int i=2;i*i<=x;i++){
        if(x%i==0){
            sum+=i;
            if(x/i!=i)
                sum+=x/i;
        }
    }
    if(sum+1==x)
        return 1;
    else if(sum+1>x)
        return -1;
    else
        return 0;
}

int main(){
    vector<int> perfect,abundant;
    for(int i=2;i<=60;i++){
        if(isPerfectNumber(i)==1)
            perfect.push_back(i);
        else if(isPerfectNumber(i)==-1)
            abundant.push_back(i);
    }
    vector<int>::iterator item1,item2;
    printf("E:");
    for(item1=perfect.begin();item1<perfect.end();item1++)
        printf(" %d",*item1);
    printf("\nG:");
    for(item2=abundant.begin();item2<abundant.end();item2++)
        printf(" %d",*item2);

    return 0;
}

发表于 2021-02-02 11:13:59 回复(0)
#include<iostream>
(720)#include<cstdio>
#include<vector>

using namespace std;

vector<int> numberE;
vector<int> numberG;

int Sum(int x){
    int sum =0;
    for(int i = 1;i < x;i ++){
        if(x % i == 0){
             sum += i;}
    }
    return sum;
}//因子之和函数Sum;

int main(){
    for(int i = 2;i <= 60;i++){
        if(i == Sum(i)){
            numberE.push_back(i);
        }
        else if(i < Sum(i)){
            numberG.push_back(i);
        }
    }//已经都加到向量里了;
    printf("E:");
    for(int i = 0;i < numberE.size();i ++){
        printf(" %d",numberE[i]);
    }
    printf("\n");
    printf("G:");
    for(int i = 0;i < numberG.size();i ++){
        printf(" %d",numberG[i]);
    }
    printf("\n");
    return 0;
}
先整了一个求因子之和的函数,然后判断
发表于 2020-04-18 10:55:15 回复(0)

暴力求解因数,然后一步一步求解就完事了。。。

#include<iostream>
(720)#include<set>
#include<algorithm>
using namespace std;
set<int>solve(int n){
    set<int>res;
    res.insert(1);
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            res.insert(i);
            res.insert(n/i);
        }
    }
    return res;
}
int main(){
    vector<int>e;
    vector<int>g;
    for(int i=2;i<=60;i++){
        set<int>res=solve(i);
        int ans=0;
        for(auto v:res){
            ans+=v;
        }
        if(ans==i){
            e.push_back(i);
        }else if(ans>i){
            g.push_back(i);
        }
    }
    cout<<"E: ";
    for(int i=0;i<e.size()-1;i++){
        cout<<e[i]<<" ";
    }
    cout<<e[e.size()-1]<<endl;
    cout<<"G: ";
    for(int i=0;i<g.size()-1;i++){
        cout<<g[i]<<" ";
    }
    cout<<g[g.size()-1]<<endl;
    return 0;
}
发表于 2020-04-09 16:47:47 回复(0)
#include <stdio.h>
#include <stdlib.h>

int is_relative(int, int);

int main()
{
    int i;
    int e[60] = {0}, g[60] = {0};
    int len1 = 0, len2 = 0;
    for(i = 3; i <= 60; i++)
    {
        int sum = 1, temp, start = 2;//必有因数1
        while((temp = is_relative(i, start)) != 0)
        {
            sum += temp;
            start = temp + 1;
        }
        if(sum == i)
        {
            e[len1] = i;
            len1++;
        }
        else if(sum > i)
        {
            g[len2] = i;
            len2++;
        }
    }
    printf("E:");
    for(i = 0; i < len1; i++)
    {
        printf(" %d", e[i]);
    }
    printf("\nG:");
    for(i = 0; i < len2; i++)
    {
        printf(" %d", g[i]);
    }
    putchar(10);
    return 0;
}

int is_relative(int n, int start)
{
    for(int i = start; i < n; i++)
    {
        if(n % i == 0)
            return i;
    }
    return 0;
}

编辑于 2020-03-31 19:31:09 回复(0)
#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)
#include<iostream>
#
include<stdio.h>
#include<vector>
#
include<cstdio>

using namespace std;
vector<int> vecE;
vector<int> vecG;

int sumFactor(int n){
    int temp=0;
    for(int i=1;i<n;i++){
        if(n%i==0) temp+=i;
    }
    return temp;
}

int main(){
   int number;
   for(number=2;number<=60;number++){
       int sum;
       sum=sumFactor(number);
       if(sum==number) vecE.push_back(number);
       else if(sum>number) vecG.push_back(number);
   }
   cout << "E: ";
   for(int i=0;i<vecE.size();i++)
        printf("%d ",vecE[i]);
    cout << endl << "G: ";
    vector<int>::iterator it;
    for(it=vecG.begin();it!=vecG.end();it++)
        printf("%d ",*it);
    return 0;
}
发表于 2020-03-18 12:16:39 回复(0)
#include<iostream>
#include<cstdio>
#include<vector>
 using namespace std;
 vector<int> numberE;
 vector<int> numberG;
 
 int Sum(int x){
	int sum=0;
	for(int i=1;i<x;i++){
		if(x%i==0)
			sum=sum+i;
	}
	return sum;
 }
 
 int main(){
	for(int i=2;i<=60;i++){
		if(i==Sum(i)){
			numberE.push_back(i);
		}
		else if(i<Sum(i)){
			numberG.push_back(i);
		}
	}
	cout<<"E:";
	for(int i=0;i<numberE.size();i++)
		cout<<" "<<numberE[i];//注意空格在前
	cout<<endl;
	cout<<"G:";
	for(int i=0;i<numberG.size();i++)
		cout<<" "<<numberG[i];
	cout<<endl;
 	return 0;
 }


编辑于 2020-03-03 22:10:46 回复(0)
#include <iostream>
(720)#include <cstdio>
#include <cstring>

using namespace std;

int arrE[59];
int arrG[59];

int SoF(int n) {
    int sum = 0;
    for(int i = 1; i <= n / 2; i++) {
        if(n % i == 0) sum += i;
    }
    return sum;
}

int main() {
    int iE = 0;
    int iG = 0;
    memset(arrE, 0, sizeof(arrE));
    memset(arrG, 0, sizeof(arrG));
    for(int n = 2; n <= 60; n++) {
        if(SoF(n) == n) {
            arrE[iE] = n;
            iE++;
        }
        if(SoF(n) > n) {
            arrG[iG] = n;
            iG++;
        }
    }
    printf("E:");
    for(int i = 0; i < 59; i++) {
        if(arrE[i] == 0) break;
        printf(" %d", arrE[i]);
    }
    printf("\nG:");
    for(int i = 0; i < 59; i++) {
        if(arrG[i] == 0) break;
        printf(" %d", arrG[i]);
    }
    return 0;
}

发表于 2020-02-23 10:22:25 回复(1)
#include <cstdio>
#include <vector>
using namespace std;
vector<int> E,G;
void fun(int n,vector<int> &num){
	for(int i=1;i<n;i++){
		if(n%i==0){
			num.push_back(i);
		}
	}
}
int add(vector<int> num){
	int sum=0;
	for(int i=0;i<num.size();i++){
		sum+=num[i];
	}
	return sum;
}
int main(){
	for(int i=2;i<=60;i++){
		vector<int> num;
		int sum=0;
		fun(i,num);
		sum=add(num);
		if(sum==i){
			E.push_back(i);
		}
		else if(sum>i){
			G.push_back(i);
		}
		else{
			continue;
		}
	}
	printf("E:");
	for(int i=0;i<E.size();i++){
		printf(" %d",E[i]);
	}
	printf("\nG:");
	for(int j=0;j<G.size();j++){
		printf(" %d",G[j]);
	}
	return 0;
}

发表于 2020-02-19 13:21:59 回复(0)
#include <stdio.h>
int main()
{
    int a[60],b[60],sum,k=0,l=0;
    for(int i=2;i<=60;i++)
    {
        sum=0;
        for(int j=1;j<=(i/2);j++)if(i%j==0)sum+=j;
        if(sum==i)a[k++]=i;
        else if(sum>i)b[l++]=i;
    }
    printf("E:");
    for(int i=0;i<k;i++)printf(" %d",a[i]);
    printf("\nG:");
    for(int i=0;i<l;i++)printf(" %d",b[i]);
}

编辑于 2020-02-06 17:30:56 回复(0)
#include <iostream>
#include <cstdio>
#include <vector>

using namespace std;

int func(int x){
    int sum = 0;
    for (int i = 1; i < x; ++i) {
        if (x % i == 0) {
            sum += i;
        }
    }
    if (sum == x) {
        return 1;   //如果是完数返回1
    } else if (sum > x) {
        return 2;   //如果是盈数返回2
    }
    return 0;   //都不是完数返回0
}

int main(){
    vector<int> wanInt;
    vector<int> yingInt;
    for (int i = 3; i < 61; ++i) {
        int k = func(i);
        if (k == 1) {
            wanInt.push_back(i);
        } else if (k == 2) {
            yingInt.push_back(i);
        }
    }
    printf("E:");
    for (int j = 0; j < wanInt.size(); ++j) {
        printf(" %d", wanInt[j]);
    }
    printf("\n");
    printf("G:");
    for (int l = 0; l < yingInt.size(); ++l) {
        printf(" %d", yingInt[l]);
    }
    printf("\n");
    return 0;
}

发表于 2020-02-03 21:12:03 回复(0)

选择j<8是因为8*8=64>60。

#include
int main(){
    int E[60] = {0}, G[60] = {0};
    int i, sum, j, div, mod;
    for(i=2; i<61; i++){
        sum = 0;
        for(j=2; j<8; j++){
            mod = i % j;
            div = i / j;
            if(div < j)
                break;
            if(mod == 0){
                if(div == j)
                    sum += div;
                else
                    sum += (div + j);
            }
        }
        sum += 1;
        if(sum == i)
            E[++E[0]] = i;
        else if(sum > i)
            G[++G[0]] = i;
    }
    printf("E:");
    for(j=1; j<=E[0]; j++)
        printf(" %d",E[j]);
    printf("\n");
    printf("G:");
    for(j=1; j<=G[0]; j++)
        printf(" %d",G[j]);
    printf("\n");
}
发表于 2019-12-31 16:42:40 回复(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)

问题信息

难度:
37条回答 10468浏览

热门推荐

通过挑战的用户

查看代码