【问题标题】:How to check if array elements are perfect numbers?如何检查数组元素是否为完美数?
【发布时间】:2021-11-15 08:43:07
【问题描述】:

我正在尝试制作一个程序,其中用户不输入数组大小,但元素是,直到输入 0。现在我想检查每个元素哪个是完美数字,因为我必须做除数的总和。问题是我无法为数组中的每个元素做除数的总和,而是将数组中所有元素的所有除数相加。

#include <stdio.h>

int main()
{
    int n = 1000, i, j, sum = 0;
    int v[n];

    for (i = 1; i < n; i++)
    {
        scanf("%d", &v[i]);
        if (v[i] == 0)
        {
            break;
        }

        for (j = 1; j < v[i]; j++)
        {
            if (v[i] % j == 0)
            {
                printf("%d", j);
                sum = sum + j;
            }
        }
    }

    printf("\n%d",sum);

    return 0;
}

OUTPUT

【问题讨论】:

  • 您能否详细说明“完美”数字的含义?
  • 在开始搜索每个数组元素的因子之前将sum重置为零。
  • @AdanVivero: Perfect number.
  • 这能回答你的问题吗? Perfect Number In C
  • @Renat no 因为它不使用数组,我可以不使用数组来做到这一点。

标签: c


【解决方案1】:

强力检查可能非常昂贵。使用欧几里得公式建立完美数表,然后简单地检查数字是否完美,速度更快。

static unsigned long long getp(int x)
{
    return (2ULL << (x - 2)) * ((2ULL << (x - 1)) - 1);
}

int isperfect(unsigned long long x)
{
    const int primes[] = {2, 3, 5, 7, 13, 17, 19, 31};
    static unsigned long long array[sizeof(primes) / sizeof(primes[0])];
    int result = 0;

    if(!array[0])
    {
        for(size_t index = 0; index < sizeof(primes) / sizeof(primes[0]); index++)
        {
            array[index] = getp(primes[index]);
        }
    }
    for(size_t index = 0; index < sizeof(primes) / sizeof(primes[0]); index++)
    {
        if(x == array[index])
        {
            result = 1;
            break;
        }
    }
    return result;
}

完美数数组仅在第一次函数调用时构建一次。

还有一些用法(你的代码有点修改)

int main(void)
{
    size_t n = 1000, i;
    unsigned long long v[n];

    for (i = 1; i < n; i++)
    {
        scanf("%llu", &v[i]);
        if (v[i] == 0)
        {
            break;
        }
        printf("%llu is %s perfect number\n", v[i], isperfect(v[i]) ? "" : "not");
    }

    return 0;
}

https://godbolt.org/z/exMs345xb

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2013-07-20
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    相关资源
    最近更新 更多