storm Опубліковано 14 Жовтня, 2010 в 19:31 #1 Опубліковано 14 Жовтня, 2010 в 19:31 От сама задача: Можно ли заданное натуральное число представить в виде суммы простых чисел, которые не должны повторятся? Cоздайте программу, которая выводит один или несколько таких вариантов.
storm Опубліковано 14 Жовтня, 2010 в 19:53 Автор #2 Опубліковано 14 Жовтня, 2010 в 19:53 осьо шото схоже найшов... але що це?? 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.
oSs Опубліковано 14 Жовтня, 2010 в 19:57 #3 Опубліковано 14 Жовтня, 2010 в 19:57 $num = 5; // задане число $n1 = 1; // перший доданок $n2 = 0; // другий доданок $i = 0; while($i++<$num){ $n2 = $num-$n1; echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++; }1 + 4 = 52 + 3 = 53 + 2 = 54 + 1 = 55 + 0 = 5
storm Опубліковано 14 Жовтня, 2010 в 20:04 Автор #4 Опубліковано 14 Жовтня, 2010 в 20:04 $num = 5; // задане число $n1 = 1; // перший доданок $n2 = 0; // другий доданок $i = 0; while($i++<$num){ $n2 = $num-$n1; echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++; }1 + 4 = 52 + 3 = 53 + 2 = 54 + 1 = 55 + 0 = 5це паскаль? що значать знаки $ ?
oSs Опубліковано 14 Жовтня, 2010 в 20:05 #5 Опубліковано 14 Жовтня, 2010 в 20:05 це змінна, паскаль непомню синтаксис. якщо чуток шариш то легко адаптуєш =)
storm Опубліковано 14 Жовтня, 2010 в 20:10 Автор #6 Опубліковано 14 Жовтня, 2010 в 20:10 я такі знаки вперше бачу... $i++<$num - ????echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++; - ???
oSs Опубліковано 14 Жовтня, 2010 в 20:18 #7 Опубліковано 14 Жовтня, 2010 в 20:18 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.
Hexus Опубліковано 15 Жовтня, 2010 в 10:47 #8 Опубліковано 15 Жовтня, 2010 в 10:47 i:= i+1; //незнаю чи потрібно вручну нарощувати, спробуйдля цикла for...to...do не надо, если while...do или repeat...until, тогда да - нужно
Banzai Опубліковано 15 Жовтня, 2010 в 11:23 #9 Опубліковано 15 Жовтня, 2010 в 11:23 поправка на ветер - Просто́е число́ — это натуральное число, которое имеет ровно два различных натуральных делителя: единицу и самого себя, и еще на ноль! бугага тоесть надо заданное натуральное число представить как сумму простых чисел (1,2,3,5,7,11,13,17,19..) - можно написать процедурку которая будет находить ближайщее (меньше или равное) простое число к заданному числу - потом отнять от заданного первое простое число - и повторить поиск для остатка и так до нуля... - ето будет грамотнее.. ну а можно загнать простые числа в массив - ограничение на максимальное натуральное будет - сумма всех простых , и просто плюсовать перебором из массива простых чисел проверяя условие (сумма=заданному числу) и если да выводить на печать последовательность .. можно задать некую вариацию для вывода вариантов - ето какбэ неграмотный вариант решения... логика алгоритма такова , програмку писать - извини - за деньги развешто читать тут http://traditio.ru/w...%81%D0%BB%D0%BE тест простоты , там же
Саня Опубліковано 15 Жовтня, 2010 в 11:37 #10 Опубліковано 15 Жовтня, 2010 в 11:37 Тільки починати терба не з наймешного простого числа, а з найбільшого.я такі знаки вперше бачу... $i++<$num - ????echo $n1.' + '.$n2.' = '.$num.'<br>'; $n1++; - ???Це не паскаль. Такий синтаксис використовуються в С.
FunTom Опубліковано 15 Жовтня, 2010 в 20:43 #11 Опубліковано 15 Жовтня, 2010 в 20:43 якщо буде час, то завтра викладу текст програми
storm Опубліковано 17 Жовтня, 2010 в 10:49 Автор #12 Опубліковано 17 Жовтня, 2010 в 10:49 ось те що я написав... для одного варыанту суми працювало, а для багатьох чомусь ны...program са;var a:array [1..30000] of boolean;n,i,j:integer;k:boolean;beginwriteln('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.
Banzai Опубліковано 17 Жовтня, 2010 в 11:19 #13 Опубліковано 17 Жовтня, 2010 в 11:19 ну для начала - если задаешь массив с для первых трёхсот натуральных с "булем простоты" то конструкция a[i*j] где i,j ->N означает что максимальное натуральное которое обработает етот алгоритм равняется корень квадратный из 300 - то-есть 17так что либо массив надо увеличивать в разы либо менять алгоритм в корне ...
Banzai Опубліковано 17 Жовтня, 2010 в 22:20 #14 Опубліковано 17 Жовтня, 2010 в 22:20 вот както так.. program summ;label 1,2,3;var n,i,j:integer;beginwriteln('');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 ... хм ... поставил на проверку максимальное .. комп всё еще считает однако для таких чисел надо конкретно оптимизировать код ... минут пять уже пиндюрит ни одного не нашло... короче более 10 лям лучше не писать насчет нескольких вариантов ... хм можно дописать чтобы допустим первое простое число пропускалось ... но тогда для маленьких чисел не факт что будет соблюдаться условие уникальности в ряду суммы... имхо ето лишнее вапще ps метод оптимизации - циклу проверки надо скармливать только те "і" последняя цифра которых не есть кратная 2;5 тоесть не 0;2;4;5;6;8 sum.rar
Рекомендовані повідомлення
Заархівовано
Ця тема знаходиться в архіві та закрита для подальших відповідей.