首页 > 试题广场 >

完数

[编程题]完数
  • 热度指数:7518 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解
    求1-n内的完数,所谓的完数是这样的数,它的所有因子相加等于它自身,比如6有3个因子1,2,3,1+2+3=6,那么6是完数。即完数是等于其所有因子(除了它自己)相加和的数。

输入描述:
    测试数据有多组,输入n,n数据范围不大。


输出描述:
    对于每组输入,请输出1-n内所有的完数。如有案例输出有多个数字,用空格隔开,输出最后不要有多余的空格。
示例1

输入

6

输出

6
import java.util.Scanner;
import java.util.ArrayList;
public class Main{
    public static void main(String[] args){
        int n = new Scanner(System.in).nextInt();
        ArrayList al = new ArrayList();
        for(int i=2;i<=n;i++){
            if(findFactor(i)){
                al.add(i);
            }
        }
        for(int i=0;i<al.size();i++){
            System.out.print(al.get(i));
            if(i != al.size()-1){
                System.out.print(" ");
            }
        }
    }
    public static boolean findFactor(int x){
        int sum=0;
        for(int i=1;i<=x/2;i++){
            if(x%i == 0){
                sum+=i;
            }
        }
        return sum == x;
    }
}
发表于 2018-08-03 01:55:35 回复(0)
#include<stdio.h>
int main()
{
    int n,i,j,sum;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        sum=0;
        for(j=1;j<i;j++)//1.找因子
            if(i%j==0)//j是i的因子
              sum+=j;
        if(sum==i)//完数
            printf("%d ",i);
    }
}

发表于 2020-04-08 11:39:23 回复(0)
Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            int n = scanner.nextInt();
            for (int i = 1; i <= n; i++) {
                int sum = 0;
                for (int j = 1; j < i; j++) 
                    if (i%j==0) sum+= j;
                if (sum==i) System.out.print(i+" ");
            }
            System.out.println();
        }
    }
}


发表于 2020-03-19 23:02:22 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
bool perfect(int n) {
	int* a = new int[n];
	int count = 0, total = 0;
	for (int i = 1; i <= sqrt(n); i++)
		if (n%i == 0) {
			a[count++] = i;
			a[count++] = n / i;
		}
	for (int i = 0; i<count; i++)
		total += a[i];
	total -= n;
	if (n == (int)sqrt(n)*(int)sqrt(n))
		total -= (int)sqrt(n);
	if (total == n)
		return 1;
	else
		return 0;
}
int main() {
	int n;
	while (cin >> n) {
		int* record = new int[n];
		int num = 0;
		for (int i = 1; i <= n; i++) {
			if (perfect(i))
				record[num++] = i;
		}
		for (int i = 0; i<num - 1; i++)
			cout << record[i] << " ";
		cout << record[num-1] << endl;
	}
}

发表于 2020-01-13 11:25:16 回复(0)
#include<bits/stdc++.h>
int main(){
    int n;
    while(scanf("%d",&n)!=EOF){
        for(int i=2;i<=n;i++){
            int sum=0,l=sqrt(i);
            for(int j=1;j<=l;j++)
                if(i%j==0) sum=sum+j+i/j;
            if(l*l==i) sum-=l;
            if(sum==2*i) printf("%d ",i);
        }
        printf("\n");
    }
}
发表于 2019-03-16 16:28:39 回复(0)
 
方法一:欧几里得完美数理论,如果p是质数,且2^p-1也是质数,那么(2^p-1)X2^(p-1)便是一个完全数。
例如p=2,是一个质数,2^p-1=3也是质数,(2^p-1)X2^(p-1)=3X2=6,是完全数。
例如p=3,是一个质数,2^p-1=7也是质数,(2^p-1)X2^(p-1)=7X4=28,是完全数。
例如p=5,是一个质数,2^p-1=31也是质数,(2^p-1)X2^(p-1)=31X16=496是完全数

def pn(p):
    return (1<<(p-1))*((1<<p)-1)
primes=[2,3,5,7,13,17,19,31]
while True:
    try:
        print(' '.join([ str(i) for i in range(1,int(input())+1)for p in primes if pn(p)==i]))
    except:
        break
 方法二:枚举
perfects=[6, 28, 496, 8128, 33550336]
while True:
    try:
        n=int(input())
        print(' '.join(str(i) for i in perfects if i<=n))
    except:
        break


发表于 2019-02-06 19:17:52 回复(0)
#include<stdio.h>
int main (){//the shorter,the better.
    int n,i,j,s,t[1000];
    for(;~scanf("%d",&n);){
        for (t[0]=0,j=2;j<=n;s==j?(t[++*t]=j):0,j++)
           for (s=1,i=2;i*i<=j;s+=j%i?0:i+j/i,i++);
        for (i=1;i<=*t;printf(i==*t?"%d\n":"%d ",t[i]),i++);
    }
}

发表于 2018-01-14 15:41:56 回复(0)

python solution:

def isPerfect(n):
    res=[]
    for i in range(1,n):
        if n%i==0:
            res.append(i)
    return sum(res)==n
while True:
    try:
        res=[]
        a=int(input())
        for i in range(1,a+1):
            if isPerfect(i):res.append(i)
        print(" ".join(map(str,res)))
    except:
        break
发表于 2017-10-03 18:04:30 回复(0)
朴素的算法
#include <stdio.h>

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

int main()
{
    int n;
    while(scanf("%d", &n)!=EOF)
    {
        bool isfirst=true;
        for(int i=1; i<=n; i++)
        {
            if(Judge(i)==true)
            {
                if(isfirst)
                {
                    printf("%d", i);
                    isfirst=false;
                }
                else printf(" %d", i);
            }
        }
        printf("\n");
    }
    return 0;
}

发表于 2018-02-23 11:36:42 回复(1)
#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {
    int n;
    while (cin >> n) {
        stringstream sstream;
        for (int i = 1; i <= n; i++) {
            int sum = 0;
            for (int j = 1; j <= i / 2; j++) {
                if (i % j == 0) {
                    sum += j;
                }
            }
            if (sum == i) {
                sstream << i << " ";
            }
        }
        string str;
        getline(sstream, str);
        str = str.substr(0, str.size() - 1);    //去掉行尾空格
        cout << str << endl;
    }
    return 0;
}

发表于 2024-02-02 12:12:39 回复(0)
#include <stdio.h>
int iswangshu(int m){//判断是否为完数
    int n;
    int sum=0;
    for(int i=1;i<m;i++){
        if(m%i==0){
            sum+=i;
        }
    }
    if(sum==m){
        return 1;
    }
    else {
    return 0;
    }
}
int main(void) {
    int s=0;
    scanf("%d",&s);
    for(int n=1;n<=s;n++){
        if(iswangshu(n)){
            printf("%d ",n);
        }
    }
  
    return 0;

编辑于 2024-01-26 21:02:28 回复(0)
#include <cstdio>


int Sum(int n){ //求因子之和
    int sum = 0;
    for(int i = 1; i < n; ++i){ //n的因子不包括n自身
        if(n%i == 0){ // i是n的因子
            sum += i; // 累加
        }
    }
    return sum;
}

int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        for(int i = 3; i <= n; ++i){
            if(Sum(i) == i){
                printf("%d ",i);
            }
        }
        printf("\n");
    }
    return 0;
}

发表于 2023-03-28 18:53:48 回复(0)
#include <iostream>
using namespace std;
bool func(int n){//判断是否是完数
    int sum=0;
    for(int i=1;i<=n/2;i++){
        if(n%i==0)  sum+=i;
    }
    return sum==n;
}
int main() {
    int n;
    while(cin>>n){
        bool first=true;//控制输出的第一个数前面没空格
        for(int i=1;i<=n;i++){
            if(func(i)){
                if(first){
                    first=false;
                }
                else{
                    cout<<" ";
                }
                cout<<i;
            }
        }
        cout<<endl;
    }
}

发表于 2023-03-24 13:46:08 回复(0)
#include <stdio.h>

int main() {
    int n, a[100], k = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i ++){
        int sum = 0;
        for(int j = 1; j <= i/2; j ++){
            if(i%j==0){
                sum += j;
            }
        }
        if(sum == i){
            a[k ++] = i;
        }
    }
    for(int i = 0; i < k; i ++){
        printf("%d%c", a[i], i==k-1?'\n':' ');
    }
    return 0;
}

发表于 2023-03-12 16:43:36 回复(0)
先看结果 
#include<iostream>
#include<stdio.h>
#include<cmath>
using namespace std;
void print(int x)
{
	int counter=0;
	cout<<x<<" is ... of  ";
	for(int j=1;j<x;j++)
	 if(x%j==0) 
	 { counter++;
	 	if(counter==1) cout<<j;
	 	else cout<<","<<j;
	 }
	 cout<<endl;
	
}
int main()
{
	int sum=0;
	 for(int i=1;i<=1000;i++)
	 {
	 	sum=0;
	 	for(int j=1;j<i;j++)
	 		if(i%j==0) sum+=j;
		 if(sum==i) 
		 {print(i);
		 }
		 
	 }
	return 0;
	
}

发表于 2022-12-21 19:38:26 回复(0)
a = int(input())
def find2(X):
    nums = []
    for i in range(1,X):
        if X%i == 0:
            nums.append(i)
    return sum(nums)
nums = []
for i in range(1,a+1):
    if find2(i)==i:
        nums.append(i)
for num in nums:
    print(num,end=" ")

发表于 2022-11-20 18:30:32 回复(0)
#include <iostream>
using namespace std;

bool Judge(int num) {
    int sum = 0;
    for (int i = 1 ; i < num ; i++) {
        if (num % i == 0)
            sum += i;
    }
    if (sum == num)
        return true;
    else
        return false;
}

int main() {

    int n;
    cin >> n;
    for (int i = 1 ; i <= n ; i++) {
        if (Judge(i))
            cout << i << " ";
    }
    return 0;
}

发表于 2022-09-21 20:05:34 回复(0)
#include<iostream>
#include<cstdio>
using namespace std;
int main() {
	int n;
	cin >> n;
	bool first = true;
	for(int i = 1; i <= n; ++i) {
		int sum = 0;
		for(int j = 1; j <= i / 2; ++j) {
			if(i % j == 0)
				sum += j;
		}
		if(sum == i) {
			if(first == true) {
				first = false;
				cout << i;
			} else {
				cout << " " << i;
			}
		}
	}
	return 0;
} 

发表于 2021-03-17 16:58:17 回复(0)
#include<stdio.h>

int main()
{
    int n,i,j,sum,k;
    int b[20]={0};
    scanf("%d",&n);
    for(k=1;k<=n;k++)
    {
        sum=j=0;
        for(i=1;i<k;i++)
        {
            if(k%i==0)
            {
                b[j++]=i;
            }
        }
        for(i=0;i<=j;i++)
        {
            sum=sum+b[i];
        }
        if(sum==k)
            printf("%d ",k);
        memset(b,0,sizeof(b));
    }
    return 0;
}

发表于 2021-02-20 17:43:02 回复(0)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>

using namespace std;

bool func(int x)
{
    int sum = 1;
    int q = sqrt(x);
    for(int i = 2; i < q; i++){
        if(x % i == 0){
            sum += i;
            sum += x / i;
        }
    }
    if(x % q == 0){
        if(q * q == x){
            sum += q;
        } else{
            sum += q;
            sum += x / q;
        }
    }
    if(sum == x){
        return true;
    }
    return false;
}

int main()
{
    int n;
    while(cin>>n){
        vector<int> res;
        for(int i =2; i < n; i++){
            if(func(i)){
                res.push_back(i);
            }
        }
        cout<<res[0];
        for(int i = 1; i < res.size(); i++){
            cout<<" "<<res[i];
        }
        cout<<endl;
    }
    return 0;
}

发表于 2021-01-16 00:01:48 回复(0)