Другие языки программирования и технологии

Паскаль!!)) входной файл содержит два числа x и y. Выходной последнюю цифру числа x в y степени! помогите пожалуйста!

Паскаль!!)) входной файл содержит два числа x и y. Выходной последнюю цифру числа x в y степени! помогите пожалуйста
Если задачу решать «в лоб» , то получается:

Z := 1; for N := 1 to Y do Z := (Z * X) mod 10;

Но нам интересна только последняя цифра. Значит:

P := X mod 10; Z := P; for N := 2 to Y do Z := (Z * P) mod 10;

Проведём небольшой анализ:

0: 0*0=0
1: 1*1=1
2: 2*2=4, 4*2=8, 8*2=16 mod 10= 6, 6*2=12 mod 10= 2 − период (4)
3: 3*3=9, 9*3=27 mod 10=7, 7*3=21 mod 10=1, 1*3=3 − период (4)
4: 4*4=16 mod 10=6, 6*4=24 mod 10=4 − период (2)
5: 5*5=25 mod 10 = 5
6: 6*6=36 mod 10=6
7: 7*7=49 mod 10=9, 9*7=63 mod 10=3, 3*7=21 mod 10 =1, 1*7=7 − период (4)
8: 8*8=64 mod 10=4, 4*8=32 mod 10=2, 2*8=16 mod 10=6, 6*8=48 mod 10=8 − период (4)
9: 9*9=81 mod 10=1, 1*9=9 − период (2)

Становится видно, что для значений X оканчивающихся на 0, 1, 5 и 6 нет смысла в умножениях:

P := X mod 10; Z := P;
if Z mod 10 in [0, 1, 5, 6] then WruteLn(Z); { результат готов }

Для других чисел достаточно выполнить до трёх умножений (при этом для 4 и 9 достаточно двух, но этим можно пренебречь) :

P := X mod 10; Z := P;
for N := 2 to Y mod 4 do Z := (Z * P) mod 10;

Ну вот!
Как-бы всё ясно:

P := X mod 10; Z := P;
if Not(Z mod 10 in [0, 1, 5, 6]) then for N := 2 to Y mod 4 do Z := (Z * P) mod 10;
WruteLn(Z);
ВТ
Виктор Твердохлебов
64 414
Лучший ответ
Не нужно так глубоко рыть, все гораздо проще.
Readln(f,x,y);
Далее находим последнюю цифру в цикле
P:=1;
For I:=1 to y do begin
P:=P*x;
P:=P mod 10;
End;
Writeln(outfile,p);
водка тебе в помощь

Похожие вопросы