Die letzte Ziffer in einer Exponentation

14

In dieser Aufgabe erhalten Sie A (weniger als 10000 Stellen lang) und B (weniger als 2 ^ 64), und Sie müssen die letzte Stelle von (A · A · A · ... · A (B-mal) berechnen )).

Die Eingaben A und B werden in einer einzelnen Zeile angegeben, die durch ein Leerzeichen getrennt ist. Die Eingaben werden von EOF abgeschlossen.

Eingang

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Ausgabe

6
3
5
9

Einschränkungen

  • Verwenden Sie keine eingebauten Funktionen oder überladenen Operatoren , um A B zu berechnen (das müssen Sie eigentlich gar nicht berechnen).
  • Kürzeste Lösung gewinnt!
Quixotic
quelle
2
Darf man den Potenzierungsoperator verwenden, um andere Dinge als A ** B zu berechnen?
Lowjacker
Ich nehme an, dass sowohl A als auch B nicht negativ sind.
aaaaaaaaaaa

Antworten:

9

J - 52 Zeichen

wd,.10|(^12+12&|)/"1(".@{:`".;._2@,&'x ');._2(1!:1)3

Besteht alle angegebenen Tests, allerdings nur, wenn die nachgestellten Leerzeichen in der dritten Eingabe entfernt wurden (ich vermute, dass dies unbeabsichtigt war).

Die Lösung funktioniert in j602 im Konsolenmodus (z. B. in Terminal, Emacs-J-Shell usw.). In j701 (nein wd) funktioniert es nicht .

Erklärung & Mathematik:

Die "magische Zahl" 12 ist die LCM der Längen der "letzten Ziffer" -Tabellen, die in den anderen Antworten gefunden wurden. Alle Ziffern wiederholen sich mit den Punkten 1, 2, 3 oder 4, so dass sie sich auch mit Punkt 12 wiederholen. Durch Addition von zwölf werden Fälle behoben, in denen b mod 12 = 0. Meine Lösung berechnet (letzte Ziffer von A) ^ (12+ (B mod 12)) eine Zahl mit der gleichen letzten Ziffer. (Ich habe eine hinterhältige Lösung in Betracht gezogen, bei der die drei Zeichen '12 + 'entfernt wurden, indem zB B mod 96 verwendet wurde, bei dem wahrscheinlich keine Beispiele kollidieren ...)

Jesse Millikan
quelle
6

Python 125 107 Zeichen

O (1) -Lösung

while 1:a,b=map(int,raw_input().split());d=1;exec"d*=a;"*(b%4);c=a%5and d%5;print b/~b+1or c+[0,5][c%2-a%2]
fR0DDY
quelle
Nizza +1.
Quixotic
6

GolfScript 21

~]2/{~.(4%)and?10%n}/

Dies berechnet im Grunde genommen, A^C mod 10wo C im Bereich liegt, [1,4]und C mod 4 = B mod 4wenn B nicht 0 ist, dann ist C auch 0.

Diese Abkürzung ist möglich, weil A^(B+4) mod 10 = A^B mod 10für jede nicht negative ganze Zahl A und positive ganze Zahl B.

aaaaaaaaaaa
quelle
5

J 79

,._2(4 :'10|x^(+y&(|~))x{10$1 1 4 4 2')/\x:".(]_1&{.`];._2~(' ',LF)e.~])(1!:1)3
Eelvex
quelle
Wow das ist hässlich! Erinnere mich daran, diese Sprache nicht zu lernen. +1 für das Aushalten.
Caleb
5

Ruby, 97 93 72 71 67 61 60

Behandelt auch den Fall, in dem b == 0 ist.

#!ruby -nl
~/ /
p eval"#$`%10*"*($'>?0?($'.to_i-1)%4+1:0)+?1

Schätze, es ist tatsächlich schlimmer, eine Nachschlagetabelle zu verwenden.

Lowjacker
quelle
Es gibt 1 als Ausgabe bei der 2 5Eingabe und gibt nicht einmal die korrekte Ausgabe für die obigen Beispielfälle. ideone.com/2cOPy
fR0DDY
1
@ fR0DDY: Es funktioniert perfekt auf meinem System, auch mit 1.9.2.
Lowjacker
4

Windows PowerShell, 85

O (1) -Lösung. Ein Hinweis aus Lowjackers Ruby-Lösung ;-)

$input|%{$a,$b=-split$_
'0000111162481397646455556666179368421919'[4*$a[-1]%48+$b%4]}
Joey
quelle
3

Python 149 Zeichen

p=[[0],[1],[6,2,4,8],[1,3,9],[6,4],[5],[6],[1,7,9,3],[6,8,4,2],[1,9]]
while 1:a,b=map(int,raw_input().split());print b/~b+1or p[a%10][b%len(p[a%10])]
fR0DDY
quelle
3

Python ( 119 134 109)

Ich vertraue darauf, dass das Verbot von integrierten Funktionen nicht für E / A gilt.

Import sys
p = Lambda b, e: e und p (b · b% 10, e / 2) · (~ e & amp; 1 oder b)% 10 oder 1
für l in sys.stdin: print p (* map (int, l.split ()))

Bearbeiten: Entfernen Sie die Verwendung des Python-Potenzierungsoperators.

Bearbeiten: Ternäre Operatoren durch kurzgeschlossene boolesche Operatoren ersetzt.

Hoa Long Tam
quelle
Ja, Sie können / müssen E / A-Funktionen für die Eingabe verwenden, aber Sie dürfen für diese Aufgabe nicht '**' verwenden.
Quixotic
Dies würde zwar funktionieren, aber ich beabsichtige diese Aufgabe nicht wirklich für eine brachiale modulare Exponentiationslösung. Tatsächlich gibt es einen O (1) -Algorithmus und er ist auch sehr kurz :-)
Quixotic
2

Python 3k

121 Zeichen

def p(a,b):
  if b<1:return 1
  return p(a*a%10,b//2)*[1,a][b%2]%10
while 1:
  a,b=map(int,input().split())
  print(p(a%10,b))

Das (a*a)%10ist nicht notwendig, aber es beschleunigt es, also entschied man sich, es zu behalten.

Bearbeiten: Anscheinend sind die Klammern nicht erforderlich.

In der Zwischenzeit über die O(1)Lösung nachzudenken . :)

st0le
quelle
Wird der Schleifenfehler nicht nach dem EOF auftreten?
Hoa Long Tam
2

Javascript ( 117 84 79 60 Zeichen)

Erreicht 60 Zeichen mit den vorgeschlagenen Verbesserungen von @JiminP und @NoOneIsHere. Vielen Dank!

d = Funktion (s, n) {a = Math.pow (s [Länge-1], n% 4 == 0? 1: n% 4) + ''; Rückgabe a [Länge-1] }

d=(s,n)=>{return(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)}

Zu testen:

console.log(d('243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222', 22337254775808));
console.log(d('38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357', 54545454123));
console.log(d('6777744348435743587643756438765436574587564354375674365645643675', 23232));
console.log(d('3875843654376574357', 54545454));

Ergebnisse:

2
3
5
9
Stephen Perelson
quelle
1
d=function(s,n){return(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)}: P
JiminP
1
Ich benutze nicht viel JavaScript, aber konnten Sie nicht d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)oder überhaupt nicht verwenden =>?
NoOneIsHere