Консультация № 161121
22.02.2009, 15:00
0.00 руб.
0 5 1
Здравствуйте, мне нужна помощь в решении вот такой задачи на паскаль.
N! − это произведение натуральных чисел от 1 до N (1 ≤ N ≤ 32767). Например, 7! = 5040. Требуется написать программу, которая по заданному N определит самую правую ненулевую цифру в записи N!
Пример входных данных: 7, пример выходных данных: 4.

Обсуждение

Неизвестный
22.02.2009, 15:46
общий
это ответ
Здравствуйте, юлия!

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

Желаю успехов!

Приложение:
{ Немного модифицированная программа; искренне благодарю
Шевченко Дмитрия за указание на странную особенность,
связанную с необходимостью держать в памяти не одну,
а несколько значащих цифр }

Program Pr161121;
Uses CRT;
Var i, N: Integer;
s: Longint; { расширенный целый тип }
Begin
ClrScr;
WriteLn('Введите натуральное число от 1 до 32767:');
Repeat
Write('N = '); ReadLn(N);
Until N > 0;

s := 1;
for i := 2 to N do
begin
s := s * i;
{ отбрасываем нули в правой части числа }
while (s mod 10 = 0)
do s := s div 10;
{ оставляем последние значащие цифры }
s := s mod 10000;
end;

WriteLn('Последня цифра в факториале: ', s mod 10);
ReadLn
End.
Неизвестный
22.02.2009, 17:21
общий
причём надо брать именно несколько значащих цифр, около 5 (s:= s mod 100000), а при выводе использовать WriteLn('Последня цифра в факториале: ', s mod 10);
Иначе программа будет работать неправильно (проверьте например 15! = 1307674368000).
Неизвестный
22.02.2009, 22:30
общий
Шевченко Дмитрий, Вы указали на довольно странную особенность программы, спасибо. Вот только я не понимаю, из-за чего так происходит?
Неизвестный
23.02.2009, 09:45
общий
Я просто хотел тоже послать такой же ответ как и Вы, но случайно обнаружил, что на числах, кратных 15, она работает неправильно..
Происходит это потому что
15*2 = 30, т.е. последняя цифра 3, как и думает Ваша программа, но
15*12 = 180, т.е. последняя цифра 8..
А вот сколько цифр всё-таки надо запоминать я так и не понял.
Ведь получается так как важна не только последняя цифра, но и предпоследняя, то и она тоже должна быть правильной, но при этом
15*312 = 4680, т.е. уже получается что надо запоминать 3 цифры!
А так как важна и третья - она тоже должна быть правильной и т.д....

В общем, такое впечатление, что в итоге тут придётся просто посчитать факториал (а 97!(что-то я перепутал), 147! и дальше - они уже длиннее 255 символов)...
Неизвестный
23.02.2009, 10:08
общий
Шевченко Дмитрий, да уж... Об эти числа любую голову сломать можно. Чтож, будем потихоньку обучатьсяЕщё раз благодарю Вас, что указали на эту особенность :)
Форма ответа