Перейти до змісту

допоможіть будь ласка вирішити задачу в паскалі


storm

Рекомендовані повідомлення

От сама задача:

Можно ли заданное натуральное число представить в виде суммы простых чисел, которые не должны повторятся? Cоздайте программу, которая выводит один или несколько таких вариантов.

Посилання на коментар
Поділитись на інші сайти

осьо шото схоже найшов... але що це?? <_<

uses crt;

const quantity = 5;

var differ:array[1..quantity] of longint;

line:string;

n,k:longint;

found,bad:boolean;

q,d:byte;

function lineint(str:string):longint;

var code:integer;

n:longint;

copy:string;

begin

code:=0;

copy:=str;

repeat

val(str,n,code);

delete(str,code,1);

until code=0;

if copy<>str then writeln('Your string - ',copy,' was changed to ',n);

lineint:=n;

end;

function prime(i:longint):boolean;

var j,lim:longint;

begin

j:=2;

lim:=round(sqrt(i));

prime:=false;

while (i mod j <> 0) and (j <= lim) do inc( j );

if ((j > lim) and (i>1)) then prime:=true;

end;

procedure find(var k:longint;var q:byte;var bad:boolean);

var m:longint;c:byte;

begin

m:=k;

c:=0;

if ((prime(m)) and ((prime(k-m)) or (k=m))) then begin

if ((n=m) and (q=1)) then writeln(n ,' is a prime number!!!')

else begin

differ[q]:=m;

write(n,' = ');

repeat

m:=differ[q];

if q>1 then write(m,' + ')

else write(m);

dec(q)

until q=0;

end;

found:=true;

end

else begin if not(bad) then while ((not(prime(m))) and (m>1)) do dec(m)

else begin

inc(d);

repeat

dec(m);

if prime(m) then inc©;

until c=d;

end;

differ[q]:=m;

inc(q);

if (k-m<7) and (not(prime(k-m)) or (k=m))

then begin

bad:=true;

dec(q);

find(k,q,bad);

end

else if n<7 then writeln(n,' can''t be expanded as a sum of prime numbers.');

if not(found) then begin

bad:=false;

k:=k-m;

find(k,q,bad);

end;

end;

end;

begin

clrscr;

writeln('Hello!!! This is a program that extends an integer number in a sum');

writeln('of prime numbers');

write('Please, type any number from the range of 2 - 2147483647 --> ');

readln(line);

writeln;

n:=lineint(line);

writeln;

q:=1;

d:=1;

k:=n;

found:=false;

bad:=false;

if n>1 then find(k,q,bad)

else writeln('There are no prime numbers less than 2! The extending is unaveliable');

writeln;

writeln('Press any key to continue... ');

readkey;

end.

Посилання на коментар
Поділитись на інші сайти

$num = 5; // задане число

$n1 = 1; // перший доданок

$n2 = 0; // другий доданок

$i = 0;

while($i++<$num){

$n2 = $num-$n1;

echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++;

}

1 + 4 = 5

2 + 3 = 5

3 + 2 = 5

4 + 1 = 5

5 + 0 = 5

Посилання на коментар
Поділитись на інші сайти

$num = 5; // задане число

$n1 = 1; // перший доданок $n2 = 0; // другий доданок $i = 0;

while($i++<$num){

$n2 = $num-$n1;

echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++;

}

1 + 4 = 5

2 + 3 = 5

3 + 2 = 5

4 + 1 = 5

5 + 0 = 5

це паскаль? що значать знаки $ ?

Посилання на коментар
Поділитись на інші сайти

це змінна, паскаль непомню синтаксис. якщо чуток шариш то легко адаптуєш =)

Посилання на коментар
Поділитись на інші сайти

я такі знаки вперше бачу...

$i++<$num - ????

echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++; - ???

Посилання на коментар
Поділитись на інші сайти

Program Reshenie;

Uses crt;

Var i,a,b,num:integer;

begin

clrscr;

i:=0;

a:=1; // перший доданок

b:=0; // другий доданок

num:=12; // наше число

for i:=0 to num do begin

b:= num-a;

writeln(a.' + '.b.' = '.num);

a:= a+1;

i:= i+1; //незнаю чи потрібно вручну нарощувати, спробуй

end;

readln;

end.

Посилання на коментар
Поділитись на інші сайти

i:= i+1; //незнаю чи потрібно вручну нарощувати, спробуй

для цикла for...to...do не надо, если while...do или repeat...until, тогда да - нужно

Посилання на коментар
Поділитись на інші сайти

поправка на ветер

- Просто́е число́ — это натуральное число, которое имеет ровно два различных натуральных делителя: единицу и самого себя,

и еще на ноль! бугага biggrin.gif

тоесть надо заданное натуральное число представить как сумму простых чисел (1,2,3,5,7,11,13,17,19..) - можно написать процедурку которая будет находить ближайщее (меньше или равное) простое число к заданному числу - потом отнять от заданного первое простое число - и повторить поиск для остатка и так до нуля... - ето будет грамотнее..

ну а можно загнать простые числа в массив - ограничение на максимальное натуральное будет - сумма всех простых , и просто плюсовать перебором из массива простых чисел проверяя условие (сумма=заданному числу) и если да выводить на печать последовательность .. можно задать некую вариацию для вывода вариантов - ето какбэ неграмотный вариант решения...

логика алгоритма такова , програмку писать - извини - за деньги развешто :)

читать тут http://traditio.ru/w...%81%D0%BB%D0%BE тест простоты , там же

Посилання на коментар
Поділитись на інші сайти

Тільки починати терба не з наймешного простого числа, а з найбільшого.

я такі знаки вперше бачу...

$i++<$num - ????

echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++; - ???

Це не паскаль. Такий синтаксис використовуються в С.

Посилання на коментар
Поділитись на інші сайти

якщо буде час, то завтра викладу текст програми

Посилання на коментар
Поділитись на інші сайти

ось те що я написав... для одного варыанту суми працювало, а для багатьох чомусь ны...

program са;

var a:array [1..30000] of boolean;

n,i,j:integer;

k:boolean;

begin

writeln('n:=');

readln(n);

for i:=1 to n do

a:=true;

for i:=2 to n do

begin for j:=2 to n do

a[i*j]:=false

end;

for i:=1 to n do

begin

k:=true;

for j:=n downto 1 do

begin

if (a[j] = true) then

begin

write(j,'+');

n:=n-j;

if k then

begin

a[j]:=false;

k:=false;

end;

end;

end;

writeln (' ');

end;

readln;

end.

Посилання на коментар
Поділитись на інші сайти

ну для начала - если задаешь массив с для первых трёхсот натуральных с "булем простоты" то конструкция a[i*j] где i,j ->N означает что максимальное натуральное которое обработает етот алгоритм равняется корень квадратный из 300 - то-есть 17

так что либо массив надо увеличивать в разы либо менять алгоритм в корне ...

Посилання на коментар
Поділитись на інші сайти

вот както так..

program summ;
label 1,2,3;
var n,i,j:integer;

begin
writeln('');
write('N='); readln(n);
write(n,' = ');

i:=n;
1:
begin
for j:=2 to i-1 do
begin
if Frac(i/j)=0 then goto 2;
end;
write(i,' + ');
n:=n-i; i:=n;
if i=0 then begin goto 3 end;
if i=1 then begin writeln('1'); goto 3 end;
if i=2 then begin writeln('2'); goto 3 end;

goto 1;
end;
2: i:=i-1;
if i>0 then goto 1;
3:
end.

знаю что безусловные переходы зл0 .. :) но тут оно как-то проще получается

тем более что на паскале десять лет уже ниче не прогал..

диапазон натуральных чисел зависит от типа переменных var n,i,j:integer; (int16) - 32,767..

можно поставить longint

Max значение longint = 2147483647 ...

хм ... поставил на проверку максимальное .. комп всё еще считает blush.gif однако для таких чисел надо конкретно оптимизировать код ...

минут пять уже пиндюрит ни одного не нашло... короче более 10 лям лучше не писать :)

насчет нескольких вариантов ... хм можно дописать чтобы допустим первое простое число пропускалось ... но тогда для маленьких чисел не факт что будет соблюдаться условие уникальности в ряду суммы... имхо ето лишнее вапще

ps метод оптимизации - циклу проверки надо скармливать только те "і" последняя цифра которых не есть кратная 2;5 тоесть не 0;2;4;5;6;8

sum.rar

Посилання на коментар
Поділитись на інші сайти

Заархівовано

Ця тема знаходиться в архіві та закрита для подальших відповідей.



×
×
  • Створити...