C/C++

Программирование на с++

Гипотеза Гольдбаха. Дано четное число n > 2. Проверить для этого числа гипотезу Гольдбаха, суть которой заключается в том, что каждое четное n, большее двух, можно представить в виде суммы двух простых чисел. Эта гипотеза на сегодняшний день не имеет строгого доказательства. Определить подпрограмму, позволяющую распознавать простые числа.
#include < iostream >
using namespace std;

bool is_simple(int n)
{
for (int i = 2; i <= n / 2; i++)
if ((n % i) == 0) return false;
return true;
}

int main()
{
int var;
cin >> var;
int c1, c2;
for (int i = 2; i < var / 2; i++) {
c1 = i;
c2 = var - i;
if (is_simple(c1) && is_simple(c2)) {
cout << c1 << "+" << c2; return 0;
}
}
cout << "Not found";
}
Наимбек Умаров
Наимбек Умаров
51 411
Лучший ответ
Для проверки пробных чисел от 4 до, скажем, миллиарда ("потолок" исследуемых чисел задаётся переменной n, в программе внизу n=1000000000, для хранения информации о простоте чисел до миллиарда включительно нужно 125 Мегабайт; я у себя ставлю n=4294967295, требуемая память для этого - больше полГигабайта, все простые числа находятся, например, на фаблете Самсунг Гэлекси примерно за 6½ минут, на нормальном компьютере, естественно, быстрее чем на смартфоне, а функция проверки числа i на простоту в нижеприведённом коде называется bit(i) ).
#include <iostream>
#include <cstdlib>
#include <cmath>
using namespace std;
unsigned long *a, b[32], c[32];
void fal(unsigned long x)
{ a[x >> 5] &= c[x & 31]; }
unsigned bit(unsigned long x)
{ return a[x >> 5] & b[x & 31]; }
int main()
{ unsigned long i, j, k, l, m, n = 1000000000, N;
i = 1; b[0] = i; c[0] = ~i; for (j = 1; j < 32; j++)
{ i <<= 1; b[j] = i; c[j] = ~i; } m = ceil((n + 1.) / 32);
a = new unsigned long [m]; for (i = 0; i <= m; i++)
a[i] = 4294967295; fal(0); fal(1);
i = ceil(sqrt(n)); for (j = 2; j <= i; j++) if (bit(j))
{ k = n / j; for (l = 2; l <= k; l++) fal(l * j); }
for (;;) { cout << "N » "; cin >> N; if (N < 3)
{ cout << N << " is less 3" << endl; continue; }
if (N & 1) { cout << N << " is not even" << endl;
continue; } if (N == 4) cout << "yes, 4=2+2" <<
endl; else { k = 1; for (i = 3; i <= N / 2; i += 2)
if (bit(i) && bit(N - i)) { cout << "yes, " << N <<
'=' << i << '+' << N - i << endl; k = 0; break; }
if (k) cout << "no" << endl; } } }
Если требуется проверить гипотезу Гольдбаха не для конкретного числа N, а для ряда чисел натурального ряда от 4 до N включительно, то программу надо изменить. Но понятно, что для достаточно больших N эта программа получится очень затратной по времени
Лёха Фролов
Лёха Фролов
29 440