L'ultima cifra di un esponente


14

In questo compito ti verranno dati A (meno di 10000 cifre lunghe) e B (meno di 2 ^ 64) e dovrai calcolare l'ultima cifra di (A · A · A · ... · A (B volte )).

Gli ingressi A e B sono indicati in un'unica riga separata da uno spazio; gli ingressi sono terminati da EOF.

Ingresso

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

Produzione

6
3
5
9

vincoli

  • Non utilizzare alcuna funzione integrata o operatori sovraccarichi per calcolare A B (non è necessario calcolarlo affatto).
  • Vince la soluzione più breve!

2
È consentito utilizzare l'operatore esponenziale per calcolare cose diverse da A ** B?
Lowjacker

Presumo che sia A che B siano non negativi?
aaaaaaaaaaaa

Risposte:


9

J - 52 caratteri

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

Supera tutti i test forniti, anche se solo se vengono rimossi gli spazi finali sul terzo input (suppongo che questo non fosse intenzionale).

La soluzione funzionerà in j602 in modalità console (ad es. In terminale, emacs j-shell, ecc.). Non funzionerà in j701 (no wd).

Spiegazione e matematica:

Il "numero magico" 12 è l'LCM delle lunghezze delle tabelle "ultima cifra" che si trovano nelle altre risposte. Tutte le cifre si ripetono con i periodi 1,2,3 o 4, quindi si ripetono anche con il periodo 12. L'aggiunta di dodici risolve i casi in cui b mod 12 = 0. La mia soluzione calcola (Ultima cifra di A) ^ (12+ (B mod 12)), dando un numero con la stessa ultima cifra. (Ho considerato una soluzione rotta subdola che eliminava i tre caratteri '12 + 'usando ad esempio B mod 96 dove nessun esempio era suscettibile di scontrarsi ...)


6

Python 125 107 caratteri

O (1) soluzione

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]

Bello +1.
Chisciotte,

6

GolfScript 21

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

Questo fondamentalmente calcola A^C mod 10dove C è nell'intervallo [1,4]e C mod 4 = B mod 4, tranne se B è 0, allora anche C è 0.

Questo collegamento è possibile perché A^(B+4) mod 10 = A^B mod 10per qualsiasi numero intero non negativo A e numero intero positivo B.


5

J, 79

,._2(4 :'10|x^(+y&(|~))x{10$1 1 4 4 2')/\x:".(]_1&{.`];._2~(' ',LF)e.~])(1!:1)3

Wow, è brutto! Ricordami di non imparare questa lingua. +1 per sopportarlo.
Caleb,

5

Rubino, 97 93 72 71 67 61 60

Gestisce anche il caso in cui b == 0.

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

Immagino che in realtà sia peggio usare una tabella di ricerca.


Fornisce 1 come output nel dare 2 5come input e non fornisce nemmeno l'output corretto per i casi di esempio sopra. ideone.com/2cOPy
fR0DDY il

1
@ fR0DDY: funziona perfettamente sul mio sistema, anche con 1.9.2.
Lowjacker,

4

Windows PowerShell, 85

O (1) soluzione. Preso un suggerimento dalla soluzione Ruby di Lowjacker ;-)

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

3

Python 149 Chars

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

3

Python ( 119 134 109)

Confido che il divieto di funzioni integrate non si applichi agli I / O.

import sys
p = lambda b, e: e e p (b * b% 10, e / 2) * (~ e & 1o b)% 10o 1
per l in sys.stdin: print p (* map (int, l.split ()))

Modifica: rimuove l'uso dell'operatore esponenziale di Python.

Modifica: ha sostituito gli operatori ternari con operatori booleani in cortocircuito.


Sì, puoi / devi usare le funzioni I / O per prendere gli input ma non dovresti usare '**' per questo compito.
Chisciotte il

Funzionerebbe però, ma non intendo davvero questo compito per una soluzione di esponenziazione modulare a forza bruta, in realtà esiste un algoritmo O (1) ed è anche molto breve :-)
Quixotic,

2

Python 3k

121 caratteri

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

Non (a*a)%10è necessario ma lo accelera, quindi ho deciso di tenerlo.

Modifica: apparentemente, le parentesi non sono richieste.

Nel frattempo, pensando alla O(1)soluzione. :)


L'errore loop non sarà dopo l'EOF?
Hoa Long Tam,

2

Javascript ( 117 84 79 60 caratteri)

Hai raggiunto 60 caratteri con i miglioramenti suggeriti da @JiminP e @NoOneIsHere. Grazie!

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

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

Testare:

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

risultati:

2
3
5
9

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

1
Non uso molto JavaScript, ma non potresti usarlo d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)o usarlo =>affatto?
NoOneIsHere il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.