注册 登录
编程论坛 C语言论坛

大学新生作业,求解

他不是恶魔 发布于 2022-10-18 10:57, 1332 次点击
判断一个数是否为完数。例如:6=3+2+1,6等于其因子之和,所以6是完数。请绘制出算法的传统流程图和N-S流程图
5 回复
#2
星泪成寒2022-10-18 11:48
程序代码:

#include <stdio.h>


int main(void)
{
    int i;
    int number;
    int sum = 0;
    printf("请输入整数: ");
    scanf("%d", &number);

    for (i = 1; i < number; i++) {
        if (number % i == 0) {
            printf("因子: %d  ", i);
            sum += i;
        }
    }
    printf("\n结果:");
   
    if (sum == number) {
        printf("%d 是完数\n", number);
    }
    else {
        printf("%d 不是完数\n", number);
    }

    return 0;
}
#3
rjsp2022-10-18 13:40
以下是引用他不是恶魔在2022-10-18 10:57:44的发言:

判断一个是否为完数。例如:6=3+2+1,6等于其因子之和,所以6是完数。请绘制出算法的传统流程图和N-S流程图

你这个“数”的限定是什么呢?为什么都喜欢出些题意不明的题目

如果你这个“数”是指 0 至 2^32-1 内的整数(对应C语言的 uint32_t 类型),那一共就 5 个,分别是 6, 28, 496, 8128, 33550336;
如果你这个“数”是指 0 至 2^64-1 内的整数(对应C语言的 uint64_t 类型),那一共就 8 个,分别是 6, 28, 496, 8128, 33550336, 8589869056, 137438691328, 2305843008139952128;
迄今为止,人类才发现51个梅森素数,第51个梅森素数是 2^82589933-1,那么第51个完数就是 (2^82589933-1)*2^(2^82589933-1),十进制的话大约需要 49724095位。
#4
他不是恶魔2022-10-18 17:44
回复 2楼 星泪成寒
请问用传统流程图要怎么画啊
#5
他不是恶魔2022-10-18 17:48
回复 3楼 rjsp
这个数应该是整数
#6
纯蓝之刃2022-10-19 15:57
程序代码:
#include <math.h>
#include <stdio.h>

int prime(unsigned long long n)
{
    unsigned long long i,k;
    k=sqrt(n)+1;
    for(i=2; i<=k; i++)
    {
        if(n%i == 0)
            return 0;
    }
    return 1;
}

unsigned long long powint(unsigned int base, unsigned int power)
{
    unsigned int i;
    unsigned long long result = 1;
    for(i=0;i<power;i++)
    {
        result *= base;
    }
    return result;
}

int main()
{
    unsigned long long mp=0;
    unsigned int pow=1, count=0;
    printf("Mersenne Prime:\n");

    while(mp<0xffffffffffffffff)
    {
        pow++;
        mp=powint(2,pow)-1;
        if(prime(mp))
        {
            count++;
            printf("M(%u)=%llu", pow-1, mp*powint(2,pow-1));
            printf("\n");
        }
    }
    printf("the number of Mersenne Prime less than unsigned long long is:%d\n", count);

    return 0;
}
1