Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Разложение нескольких чисел на простые

Автор: Kolyancz 27.10.2008 22:52

На входе дано несколько чисел. Каждое число разложите на простые.
Каждое разложение должно быть записано в отдельной строчке. Если число состоит из нескольких простых, то простые должны быть разделены пробелом.
Все числа положительные и меньше 2^31.

Пример:
6
15
23
128

Выдача:
2 3
3 5
23
2 2 2 2 2 2 2


Автор: Lapp 28.10.2008 2:22

Хорошо. А вопрос-то какой?.. blink.gif

Автор: samec 28.10.2008 2:32

вот тут http://forum.pascal.net.ru/index.php?showtopic=11200 что то подобное уже решалось.

Автор: Kolyancz 28.10.2008 6:37

Вопрос в написать программу.
Я воспользовался уже имеющимися решениями. Вот что полоучилось:



procedure Factorization(x: word);
var i: word;
procedure DivX;
begin
while (x>1)
and (x
mod i = 0)
do
begin
write(i:4); x:= x
div i;
end;
end;
begin i:=2; DivX; i:=3;
while (i < x
div 2)
do
begin DivX; inc(i,2);
end;
if x>1
then writeln(x:15);
end;

var x,a,b,c,d,e :word;

begin
readln (a);
readln (b);
readln ©;
readln (d);
x:=a;
Factorization(x);
x:=b;
Factorization(x);
x:=c;
Factorization(x);
x:=d;
Factorization(x);
readln;
readln;
end.



Эта прога решает приведенный выше пример, но есть баги: например если первое число 9, а второе 15, то ответ - разложение первого и второго числа она выводит на одной строчке, а должна на разних.
Не могу решить, самого важного: кол-во чисел неопределено и разложение должно работать для чисел до 2 в 31-ой.

Автор: Lapp 28.10.2008 7:14

Н-да.. Впервые вижу ТАКОЙ нечесаный код... Даже арифметические операторы гуляют по строчкам безо всякой нужды..
Короче, вот, поработал над твоим текстом. Ошибки исправил и много чего еще. Но там все равно еще далеко до зачетного варианта smile.gif. Разбирайся:

procedure Factorization(x: word);
var
i: word;

procedure DivX;
begin
while (x>1) and (x mod i = 0) do begin
write(i,' ');
x:= x div i;
end;
end;

begin
i:=2;
DivX;
i:=3;
while (i < x div 2) do begin
DivX;
inc(i,2);
end;
if x>1 then writeln(x) else WriteLn;
end;

var x,a,b,c,d,e :word;

begin
readln (a);
readln (b);
readln ©;
readln (d);
Factorization(a);
Factorization(b);
Factorization( c);
Factorization(d);
readln;
end.

Что касается нефиксированного числа вводимых параметров, то самый простой выход такой:
  repeat
readln (a);
if a>1 then Factorization(a);
until a=0;

Но он перемежает вводимые числа и результаты. Если это тебя смущает - надо запоминать входные данные в массив: читать ввод в цикле до ввода нуля, считая количество введенных чисел, а потом все в цикле же и обработать.

Автор: Lapp 28.10.2008 8:03

Еще одна проблема - с диапазоном чисел. У тебя вообще тип word, что ограничивает все числом 65535. Замени его на LongInt.