Проверка гипотезы Гольдбаха

Ответить
VITEL5
Сообщения: 3
Зарегистрирован: 23 июн 2009, 17:11

Помогите разобраться с задачей.
Дано четное число n > 2. Проверить для него гипотезу Гольд¬баха; каждое четное n представляется в виде суммы двух простых чисел.

program p7;
var n,k,s1,s2,nv:integer;
sn1,sn2:boolean;

procedure vvod;
begin
writeln ('vvedite chetnoe chislo, bolshe dvyh: ');
readln (n);
if n <=2 then writeln ('vvedeno chislo menshe dvyh! ');
if (n mod 2)<>0 then writeln ('vvedeno nechetnoe chislo! ')
end;

function proverka (pch:integer): boolean;
var x,i:integer;
begin
proverka:=false;
x:=2;
i:=1;
while (x<pch) and (i=1) do
begin
if pch mod x=0 then i:=0 else inc(x);
end;

if i=1 then proverka:=true;
end;

begin
nv:=0;


for k:=1 to n-1 do
begin
if k<=n/2 then
begin
s1:=k;
s2:=n-k;
end;

vvod;
sn1:=proverka(s1);
sn2:=proverka(s2);
if sn1 and sn2 then
begin
inc(nv);
if nv=1 then writeln ('dlya chisla ',n,' gipotiza GoldBaha verna!!!.' );
writeln (n, '=', s1, '+', s2);
readln;
end;
end;
end.
Хыиуду
Сообщения: 2442
Зарегистрирован: 06 мар 2005, 21:03
Откуда: Москва
Контактная информация:

Проверка на простоту числа есть в разделе "алгоритмы", там она более оптимальна. Цикл надо вести не до самого pch, а до sqrt(pch), если уж до него делителей не нашлось - дальше их точно не будет. Переменная i в вашей функции даром не нужна.
Уберите процедуру vvod, перенесите все операторы из нее в основное тело программы - может быть, косяки возникают из-за области видимости переменных. Оформлять ее процедурой смысла нет - она выполняется в программе ровно один раз.
Все тело программы можно записать в три строки
for k:=1 to n div 2 do
if proverka(k) and proverka(n-k)
then writeln(n,'=',k,'+',n-k);
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
VITEL5
Сообщения: 3
Зарегистрирован: 23 июн 2009, 17:11

Переделал программу, но все равно осталась ошибка 8), использовал процедуру потому что условие задачи этого требует.
Спасибо за помощь!
Вот переделка:
program p7;
var n,k:integer;

procedure vvod;
begin
writeln ('vvedite chetnoe chislo, bolshe dvyh: ');
readln (n);
if n <=2 then writeln ('vvedeno chislo menshe dvyh ');
if (n mod 2)<>0 then writeln ('vvedeno nechetnoe chislo! ')
end;

function proverka (pch:longint):boolean;
var i:longint;
begin
for i:=2 to trunc (sqrt(pch)) do
if n mod i=0 then
begin
proverka:=false;
exit;
end;
proverka:=true;
end;
begin
vvod;
for k:=1 to n div 2 do
if proverka(k) and proverka(n-k) then writeln (n,'=',k, '+',n-k);
readln;
end.
Ответить