Вопрос Какой язык программирования сможет решить задачу? (Pascal не смог)

Регистрация
7 Ноя 2013
Сообщения
79
Репутация
0
Спасибо
0
Монет
0
Помогите, пожалуйста, господа-программисты. По алгебре было задание найти последнюю цифру числа 333^335. Я решил, получилось 7. Для уверенности проверил в Паскале (PascalABC), т.к. с другими языками программирования я плохо знаком. Написал вот такую примитивную программу:

var a,n,cifra:integer;

begin

a:=333;

n:=1;

repeat

begin

a:=(a*333);

n:=n+1;

cifra:=(a mod 10);

end

until n=335;

write('последняя цифра = ',cifra);

end.

Всё бы хорошо, но Паскаль мне говорит: "последняя цифра = 1". Тут я уж не поленился и полностью расписал вручную все значения степени до 335 (периодом подбирал: 5степень - 3, 15степень - 7, 25степень - 3, 35степень - 7 и т.д.), и у меня всё равно вышло значение 7. Я так полагаю, что программе просто тяжело так много считать, и где-то она сбилась. Скажите, пожалуйста, можно ли решить эту задачу в паскале, и, если нет, то можно ли её решить в каком-нибудь другом языке программирования? Заранее благодарю.
 
333 ^ 335 последняя цифра числа, так что задачу упрощаем до 3 ^ 335
Программист думает за компьютер и создает программу
3 - в конце 3
3*3 - в конце 9
3*3*3 - в конце 7
3*3*3*3 - в конце 1
3*3*3*3*3 - в конце 3
3*3*3*3*3*3 - в конце 9
3*3*3*3*3*3*3 - в конце 7
3*3*3*3*3*3*3*3 - в конце 1
Как видишь идет последовательность 3 9 7 1 и усе, даже компьютера не надо

На паскале все тоже можно:

var
a: BigInteger;
i: Integer;

begin
a := 1;
for i := 1 to 335 do
begin
a := a * 3;
end;

Writeln(a);

end.

Только ответ не такой как ниже так как я упростил задачу до 3 ^ 335:

6848892208188538287483832805385295026551067207348700786053090333322124682953755796517397310844406703021418164138549568090016503923723098786081915834717151161707

А если не упрощать, то сходится:
104428303963710884031996217410926079033001743437583849801773739996601002969847117146981471048184870115150822328203877365207294716013959966059805494210332820661018739546452171563309460722530854807185262628295540682976979866673378165836012214950618661959903125601489024531661490951209984569103708485086224009212621642374633666319344931694254364060998762577380911749491002517414410123028549932735107128351676291649034007726892864452666373732345642509052508402258619705478985322861109677796592159565167994512958227677781694934523468140681692170107340664043535122350444902376268207962011119715877647026206375939263806371006222200384797643237888031204492818792726653648908643484829053615064311053504777701761054868076544156183254780351345325292121694665829599260328664523308500751353767387074968660926218651489233304845625125224342074038682283845321157
 
нет ли переполнения и потери последних знач цифр???
имхо нужен другой подъход к решению.
не лобовой!
 
Где-то ты с количеством итераций что-то напутал и попал на единичку. Одна лишняя итерация.
 
В Паскале ABC.NET есть тип BigInteger, на котором 333³³⁵ вычислить легко (этот же тип есть, кстати, и в C# !). Но на Питоне определить последнюю десятичную цифру этого числа легче всего:
print(333**335%10) - вот и вся программа!.
 
Скорее всего Паскаль не справляется с таким большим размером цифр и пишет абы что, можно наверное это обойти или использовать другие языки, типо питона, семейства си и других популярных языков, в которые Паскаль не входит...
 
На питоне можно, там поддерживается длинная арифметика по стандарту. И вправду в конце 7.
Хз почему паскаль умирает, ведь идёт переполнение старших битов, а они нам и не особо нужны.
104428303963710884031996217410926079033001743437583849801773739996601002969847117146981471048184870115150822328203877365207294716013959966059805494210332820661018739546452171563309460722530854807185262628295540682976979866673378165836012214950618661959903125601489024531661490951209984569103708485086224009212621642374633666319344931694254364060998762577380911749491002517414410123028549932735107128351676291649034007726892864452666373732345642509052508402258619705478985322861109677796592159565167994512958227677781694934523468140681692170107340664043535122350444902376268207962011119715877647026206375939263806371006222200384797643237888031204492818792726653648908643484829053615064311053504777701761054868076544156183254780351345325292121694665829599260328664523308500751353767387074968660926218651489233304845625125224342074038682283845321157
 
Назад
Сверху