如何检查数组元素是否为完美数字



我正在尝试制作一个程序,其中用户不输入数组大小,而是输入元素,直到输入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;
}

输出

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

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 numbern", v[i], isperfect(v[i]) ? "" : "not");
}
return 0;
}

https://godbolt.org/z/exMs345xb

最新更新