Быстрый поиск совершенных чисел
Чтобы легко можно было отсылать вопрошающих по этому вопросу, создаю новую тему.
Напомню, что
Совершенное число — натуральное число, равное сумме всех своих собственных делителей (т. е. всех положительных делителей, отличных от самого́ числа).
#include <iostream>
#include<cstdlib>
const unsigned long long N = 5000000000000000000llu;
// решето Эратосфена
void Eratosfen(char *a, unsigned long n)
{
unsigned long i, j;
a[0] = a[1] = 0; a[2] = 1;
for(i = 4; i < n; i += 2)
a[i] = 0;
for(i = 3; i < n; i += 2)
a[i] = 1;
i = 3;
while (i*i <= n)
{
for(j = i << 1; j < n; j += i)
a[j] = 0;
i += 2;
while (i < n && a[i] == 0)
i += 2;
}
}
// количество значащих бит числа
unsigned long Count(unsigned long long a)
{
unsigned long long count;
for(count = 0; a; a >>= 1)
++count;
return count;
}
// проверка на простоту
int Prime(unsigned long long a)
{
unsigned long long i;
if (a == 2)
return 1;
if (a == 0 || a == 1 || a % 2 == 0)
return 0;
for(i = 3; i*i <= a && a % i; i += 2)
;
return i*i > a;
}
int main()
{
char *eratosfen;
unsigned long long sov, i, n = (Count(N) >> 1) + 1;
eratosfen = (char *)calloc(n, sizeof(*eratosfen));
Eratosfen(eratosfen, n);
// вывод совешенных чисел
for(i = 2; i < n; ++i)
if (eratosfen[i] && Prime((1 << i) - 1))
{
sov = ((1llu << i) - 1llu) << (i - 1llu);
std::cout << (unsigned long long)sov << std::endl;
}
free(eratosfen);
return 0;
}
Комментарии:
Нету комментариев для вывода...