#1 17.03.10 15:14
[C++] Ошибка в программе
Помогите найти ошибку
Код::
/*48. Для всех четных чисел заданного диапазона проверить гипотезу Гольдбаха: каждое четное число представимо в виде суммы двух простых чисел.*/
#include <stdio.h>
#include <conio.h>
char cRezult[100];
char* find(int iInputBegin,int iInputa)
{
int i,j,s1,s2,k=0,flag=0;
char iDiapozon[100]
{
for(i=0; iInputBegin < iInputa; i++)
{
iDiapozon[i] = iInputBegin;
iInputBegin++;
}
}
{
j=0;
for(i=0; i<iDiapozon[j]; i++,j++)
{
if (i%i=0) flag++;
if (flag<=2)
{
s1=i;
j++;
flag=0;
for(i++; i<iDiapozon[j]; i++,j++)
{
if (i%i=0) flag++;
if (flag<=2) s2=i;
}
}
}
if (iDiapozon[i] == s1 + s2) cRezult[k] = iDiapozon[i];
k++;
}
return cRezult;
}
int main()
{
int iInputBegin,iInputLast;
char* cResult[100];
scanf("%d",iInputBegin);
scanf("%d",iInputLast);
cResult = find(iInputBegin,iInputLast);
printf("%s",cResult);
_getch();
return 0;
}Offline
#2 17.03.10 20:41
Re: [C++] Ошибка в программе
так тут вся программа одна большая ошибка.
первый цикл должен перебирать чётные числа
вложенный цикл должен перебирать все числа от 1 до половины проверяемого числа и искать простое. Функцию которая определяет простое число или нет лучше сделать отдельную (простое делится только на 1 и на себя). Как только простое число найдено, вычитаем его из проверяемого чётного числа и получившуюся разность проверяем на "простоту" вызвав функцию. Если число простое, то печатаем наше чётное и прерываем вложенный цикл. Переходим к проверке следующего четного числа из диапазона.
Всё-таки лучше использовать только int, ведь char слишком мал. Никакие массивы здесь не нужны, разве что для оптимизации и кэширования найденых простых чисел.
з.ы.
я бы даже сделал отдельную функцию проверяющую можно ли представить число в виде суммы двух простых.
Нужно ведь только проверить, все ли чётные числа можно представить, так что, как только найдено хоть одно число, которое не представляется суммой простых можно прерывать проверку 8)
Исправлено $up (17.03.10 21:12)
Offline
#3 17.03.10 21:17
Re: [C++] Ошибка в программе
да, и для справки:
В математике проблемой Гольдбаха или гипотезой Гольдбаха называется следующая проблема
Любое нечётное число не меньшее семи можно представить в виде суммы трёх простых чисел.
Например,
7 = 3 + 2 + 2
9 = 3 + 3 + 3
и так далее.
Вариантом проблемы Гольдбаха (её ещё называют тернарной проблемой Гольдбаха) является проблема Эйлера (или бинарная проблема Гольдбаха), которая до сих пор является одной из старейших нерешённых проблем:
Любое чётное число не меньшее четырёх можно представить в виде суммы двух простых чисел.
Offline
#5 17.03.10 21:26
Re: [C++] Ошибка в программе
$up написал(а):
Как только простое число найдено, вычитаем его из проверяемого чётного числа и получившуюся разность проверяем на "простоту" вызвав функцию.
нужно проверить все простые числа меньше либо равные половине проверяемого четного числа. ну и соответственно пары к ним. если каждая пара будет не простым числом, тогда гипотеза не выполняется для проверяемого числа..
Offline
#6 17.03.10 21:34
Re: [C++] Ошибка в программе
Anti-Killer, это ты похоже не понял, мою писанину 8)
Anti-Killer написал(а):
нужно проверить все простые числа меньше либо равные половине проверяемого четного числа.
$up написал(а):
вложенный цикл должен перебирать все числа от 1 до половины проверяемого числа и искать простое.
я бы мог и код написать, только это будет медвежья услуга.
Исправлено $up (17.03.10 21:39)
Offline
#7 17.03.10 21:42
Re: [C++] Ошибка в программе
$up, кто-то ты так, ага, замутно написал)
просто у тебя так получается, что находим первое простое число (а это будет ясное дело 1), вычитаем из проверяемого, проверяем полученную разность на простоту и всё. :) лишь слова "прерываем вложенный цикл" дают зацепку, что это только одна из итераций для проверяемого числа.
Offline
#8 17.03.10 21:50
Re: [C++] Ошибка в программе
Anti-Killer, да, с описанием алгоритма есть такая проблема, когда картинка в голове сложилось, думаешь что это очевидно, и не описываешь более подробно.
В детстве компов не было, писали программы на бумажках, и чтобы по сто раз не переписывать, сначала весь код в уме напишешь, потом на листочек выгрузишь 8)
Offline
#9 17.03.10 22:17
Re: [C++] Ошибка в программе
DaZzle написал(а):
if (i%i=0) flag++;
Вот эта строчка просто убивает. Что вы хотели этим сказать?
Вообще-то i%i==0 - тавтология... Вы еще и не сравниваете, а присваиваете...
А вообще
$up написал(а):
так тут вся программа одна большая ошибка.
Исправлено Revenger (17.03.10 22:20)
Offline
#10 17.03.10 23:38
Re: [C++] Ошибка в программе
Revenger написал(а):
DaZzle написал(а):
if (i%i=0) flag++;
Вот эта строчка просто убивает. Что вы хотели этим сказать?
тож над этим поржал. хотел было написать, но посмотрев в целом код, решил его вообще не касаться :)
Offline

