Le dernier chiffre d'une exponentation

14

Dans cette tâche, vous recevrez A (moins de 10000 chiffres) et B (moins de 2 ^ 64), et vous devrez calculer le dernier chiffre de (A · A · A · ... · A (B fois )).

Les entrées A et B sont données sur une seule ligne séparée par un blanc; les entrées sont terminées par EOF.

Contribution

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Production

6
3
5
9

Contraintes

  • N'utilisez pas de fonction intégrée ou d'opérateurs surchargés pour calculer A B (vous n'avez pas vraiment besoin de calculer cela du tout).
  • La solution la plus courte gagne!
Chimérique
la source
2
Est-il permis d'utiliser l'opérateur d'exponentiation pour calculer des choses autres que A ** B?
Lowjacker
Je suppose que A et B sont non négatifs?
aaaaaaaaaaaa

Réponses:

9

J - 52 caractères

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

Réussit tous les tests donnés, mais uniquement si les espaces de fin sur la troisième entrée sont supprimés (je suppose que cela n'était pas intentionnel).

La solution fonctionnera en j602 en mode console (par exemple dans un terminal, emacs j-shell, etc.). Cela ne fonctionnera pas en j701 (non wd).

Explication et mathématiques:

Le «nombre magique» 12 est le LCM des longueurs des tableaux «dernier chiffre» trouvés dans les autres réponses. Tous les chiffres se répètent avec les périodes 1, 2, 3 ou 4 donc ils répéteront également avec la période 12. Ajouter douze à cela corrige les cas où b mod 12 = 0. Ma solution calcule (dernier chiffre de A) ^ (12+ (mod B 12)), donnant un nombre avec le même dernier chiffre. (J'ai considéré une solution cassée sournoise éliminant les trois caractères '12 + 'en utilisant par exemple B mod 96 où aucun exemple n'était susceptible d'entrer en collision ...)

Jesse Millikan
la source
6

Python 125 107 Chars

Solution O (1)

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
la source
Nice +1.
Quixotic
6

GolfScript 21

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

Cela calcule essentiellement A^C mod 10 où C est dans la plage [1,4]et C mod 4 = B mod 4, sauf si B est 0, alors C est également 0.

Ce raccourci est possible car A^(B+4) mod 10 = A^B mod 10pour tout entier non négatif A et entier positif B.

aaaaaaaaaaaa
la source
5

J, 79

,._2(4 :'10|x^(+y&(|~))x{10$1 1 4 4 2')/\x:".(]_1&{.`];._2~(' ',LF)e.~])(1!:1)3
Eelvex
la source
Wow c'est moche! Rappelle-moi de ne pas apprendre cette langue. +1 pour le supporter.
Caleb
5

Rubis, 97 93 72 71 67 61 60

Gère également le cas où b == 0.

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

Je suppose que c'est en fait pire d'utiliser une table de recherche.

Lowjacker
la source
Il donne 1 en sortie en donnant 2 5en entrée et ne donne même pas de sortie correcte pour les cas d'échantillon ci-dessus. ideone.com/2cOPy
fR0DDY
1
@ fR0DDY: Cela fonctionne parfaitement sur mon système, avec 1.9.2 aussi.
Lowjacker
4

Windows PowerShell, 85

O (1) solution. Inspiré de la solution Ruby de Lowjacker ;-)

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

Python 149 caractères

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
la source
3

Python ( 119 134 109)

J'espère que l'interdiction des fonctions intégrées ne s'applique pas aux E / S.

importer sys
p = lambda b, e: e et p (b * b% 10, e / 2) * (~ e & 1or b)% 10or 1
pour l dans sys.stdin: print p (* map (int, l.split ()))

Éditer: supprimer l'utilisation de l'opérateur d'exponentiation de Python.

Edit: opérateurs ternaires remplacés par des opérateurs booléens court-circuités.

Hoa Long Tam
la source
Oui, vous pouvez / devez utiliser les fonctions d'E / S pour prendre les entrées, mais vous n'êtes pas censé utiliser '**' pour cette tâche.
Quixotic
Cela fonctionnerait cependant, mais je n'ai pas vraiment l'intention de cette tâche pour une solution d'exponentiation modulaire forcée, il existe en fait un algorithme O (1) et il est très court aussi :-)
Quixotic
2

Python 3k

121 caractères

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))

Le (a*a)%10n'est pas nécessaire mais il l'accélère, alors j'ai décidé de le garder.

Edit: Apparemment, les parenthèses ne sont pas nécessaires.

Pendant ce temps, réfléchissons à la O(1)solution. :)

st0le
la source
Est-ce que l'erreur de boucle ne sera pas après l'EOF?
Hoa Long Tam
2

Javascript ( 117 84 79 60 caractères)

Atteint 60 caractères avec les améliorations suggérées de @JiminP et @NoOneIsHere. Je vous remercie!

d = fonction (s, n) {a = Math.pow (s [s.length-1], n% 4 == 0? 1: n% 4) + ''; renvoie a [a.length-1] }

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

Tester:

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

Résultats:

2
3
5
9
Stephen Perelson
la source
1
d=function(s,n){return(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)}: P
JiminP
1
Je n'utilise pas beaucoup JavaScript, mais ne pourriez-vous pas utiliser d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)ou utiliser =>du tout?
NoOneIsHere