由用户输入的若干正整数,求出以下数据:所有完数、完数的个数、完数占所有输入数据百分比以及最大的完数

C语言编程题: 自用户输入的若干正整数,求出以下数据:所有完数、完数的个数、完数占所有输入数据的百分比以及最大的完数。打印所有完数时每行显示5个。

第1个回答  2019-04-16

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。如果一个数恰好等于它的因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,后面的完全数还有8128、33550336等等。

实际上在int可表示范围内的完数少的可怜

1……6
2……28
3……496
4……8,128
5……33,550,336
6……8,589,869,056
7……137,438,691,328
8……2,305,843,008,139,952,128
9……2,658,455,991,569,831,744,654,692,615,953,842,176
10……191,561,942,608,236,107,294,793,378,084,303,638,130,997,321,548,169,216
11……13,164,036,458,569,648,337,239,753,460,458,722,910,223,472,318,386,943,117,783,728,128
12……14,474,011,154,664,524,427,946,373,126,085,988,481,573,677,491,474,835,889,066,354,349,131,199,152,128

示例代码: 求出 1000以内的所有完数

#include "stdio.h"
int main()
{
    int j,k,sum = 0;
    for(k=2;k<=1000;k++) {
        sum=0;
        for(j=1;j<k;j++)
            if(k%j==0)
                sum=sum+j;
        if(sum==k)
            printf("%d ",k);
   }
}

示例代码: 求出 1000以内的所有完数

#include "stdio.h"
int isPerfect(int n){
    if(n<6) return 0;
    int sum = 0;
    for(int i = 1; i < n; ++i) {
        if( n % i == 0) sum += i;
        if(sum > n) return 0;
     }
     if(sum == n) return 1;
     return 0;    
}
int main()
{
    int n, numbers = 0, perfects = 0;
    printf("请输入整数(负数或0退出): \n");
    do {
        scanf("%d", &n);
        if(n <= 0) break;
        if(isPerfect(n)) ++perfects;
        ++numbers;
    } while (true);
    if(numbers > 0) {
        printf("你一共输入 %d 个数,其中 %d 个完数, 占 %lf%%\n",
            numbers, perfects, 100.0 * perfects / numbers);
     } else {
         printf("你没有输入任何有效数据\n");
     }
}

追问

你能帮我解决一下我提出的这个问题吗?我知道完全数的定义

本回答被网友采纳