Помощь - Поиск - Пользователи - Календарь
Полная версия: Разложение нескольких чисел на простые
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Kolyancz
На входе дано несколько чисел. Каждое число разложите на простые.
Каждое разложение должно быть записано в отдельной строчке. Если число состоит из нескольких простых, то простые должны быть разделены пробелом.
Все числа положительные и меньше 2^31.

Пример:
6
15
23
128

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

Lapp
Хорошо. А вопрос-то какой?.. blink.gif
samec
вот тут Разложение чисел на простые множители что то подобное уже решалось.
Kolyancz
Вопрос в написать программу.
Я воспользовался уже имеющимися решениями. Вот что полоучилось:


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
Н-да.. Впервые вижу ТАКОЙ нечесаный код... Даже арифметические операторы гуляют по строчкам безо всякой нужды..
Короче, вот, поработал над твоим текстом. Ошибки исправил и много чего еще. Но там все равно еще далеко до зачетного варианта 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
Еще одна проблема - с диапазоном чисел. У тебя вообще тип word, что ограничивает все числом 65535. Замени его на LongInt.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.