Помощь - Поиск - Пользователи - Календарь
Полная версия: Наименьшее общее кратное из файла
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
dog
Задача:

С клавиатуры вводится N целых чисел (из интервала [10; 100]).

Требуется

1. записать все введенные числа в файл

2. открыть файл и вывести на экран все записанные в него числа (в строку)

3. найти наименьшее общее кратное компонентов, в записи которых нет цифры k.

примечание: массивы в программе не использовать


PROGRAM PRP1;

FUNCTION NOD (x,y:INTEGER):INTEGER;
BEGIN
IF x<>0 THEN NOD:=NOD(y MOD x, x) ELSE NOD:=y;
END;

function NOK(x,y:INTEGER):INTEGER;
BEGIN
NOK:=(x DIV NOD(x,y))*y;
END;

VAR f: FILE OF INTEGER;
i,
x1, x2,
m,
k,
n
:INTEGER;


BEGIN
{----------------------------1-----------------------}
REPEAT
WRITE('Имя файла - ');
READLN(name);
ASSIGN(f, name);
{$I-}
REWRITE(f);
{$I+}
UNTIL IOResult=0;
WRITE('Начинаем ввод последовательности');
WRITELN(' (конец последовательности > 10 или < 100)');
WHILE (true) DO
BEGIN
WRITE('Значение = ');
READLN(n);
IF (n <=10) OR (n >=100) THEN BREAK;
WRITE(f,n);
END;
CLOSE(f);
{-----------------------------2------------------------}
WRITELN(' В файле были написаны числа ');
RESET(f);
WHILE NOT EOF(f) DO
BEGIN
READ(f,n);
WRITE(n, ' ');
END;
WRITELN;

{----------------------------3--------------------------}
WRITE('Введите цифру k - ');
READLN(k);
WRITE('Числа, не содержащие k - ');
SEEK(f, 0);
FOR i:=0 TO FileSize(f)-1 DO
BEGIN
READ(f,n);
x1:= n DIV 10;
x2:= n MOD 10;
IF (x1<>k) AND (x2<>k) THEN
BEGIN
WRITE(n, ' ');


END;
END;
WRITELN;
END.



Первые два пункта вообще никаких проблем, выделить числа не содержащие k тоже никакой проблемы, а вот найти наименьшее общее кратное без создания массива ???
volvo
Цитата
а вот найти наименьшее общее кратное без создания массива ???
А зачем тебе для нахождения НОК нескольких чисел понадобился массив? Вообще-то NOK(a, b, c) = NOK(NOK(a, b), c) ... Этого достаточно, чтобы посчитать кратное для любого количества чисел безо всяких массивов.
sheka
Можно так:

//...
CurrNOK:=1; //просто потому, что меньше 10
FOR i:=0 TO FileSize(f)-1 DO
BEGIN
READ(f,n);
x1:= n DIV 10;
x2:= n MOD 10;
IF (x1<>k) AND (x2<>k) THEN
BEGIN
write(n,' ');
if CurrNOK<10 then
CurrNOK:=n
else
CurrNOK:=NOK(CurrNOK,n);
END;
END;
close(f); //Это не забыл? smile.gif
WRITE('NOK = ', CurrNOK);
readln;
END.

все работает чики-пики.
Lapp
Цитата(sheka @ 11.09.2010 22:46) *
CurrNOK:=1; //просто потому, что меньше 10
Sheka, что ты имел в виду под этим комментом? при чем тут <10?


Добавлено через 3 мин.

Цитата
все работает чики-пики.
Держи ложку дегтя smile.gif.

числа: 2, 3
цифра k=0

твой ответ, если не ошибаюсь, будет равен NOK=1?

Добавлено через 2 мин.
нет, дела еще хуже.. ((

числа: 1,2,3,4,5,6,7,8,9
k: 1

NOK=9 ???

Зачем вообще проверка на <10 ?
sheka
yes2.gif Ага.
Цитата
С клавиатуры вводится N целых чисел (из интервала [10; 100]).
+ из кода
Цитата
IF (n <=10) OR (n >=100) THEN BREAK;
т.е. я здесь чтобы не вводить лишнюю логическую переменную использовал ограничения условия задачи. Единственное что может быть, так это то, что автор не предусмотрел того случая, если ни одно из введеных чисел не удовлетворяет ВСЕМ условиям. Хотя.. Как раз эту проверку надо вставлять в том куске кода, который написал я smile.gif. Ну я думаю ТС это сделает, да?

Добавлено через 2 мин.
я бы инициализировал CurrNOK как "Восемь с половиной миллионов" - любимое число моего преподавателя математики, но, к сожалению, integer..
Lapp
Да, все верно, зря я воду намутил )). Невнимательно читал условие, сорри.
Извиняюсь.
Lapp
sheka +1
от dog и просто ответа (не говоря про "спасибо") фиг дождешься.
Живые собаки гораздо багодарнее...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.