指数的最后一位


14

在此任务中,您将获得A(少于10000位数字)和B(少于2 ^ 64),并且需要计算(A·A·A·...·A(B次))。

输入A和B在一行中以空格隔开;输入由EOF终止。

输入值

34543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222345432323213232432424345445334453434324343111122234543232321323243242434544533445343432434311112223454323232132324324243454453344534343243431111222 22337254775808
38758436543765743875437656358764347568437658743658743454354645645543532487548758475847684756897548758457843758437584758478574857438758436587436587436587643875643856783478743658743658764387564387564378658437658743658743687564387564387564765746576475647564756475465746574675647654765476547534587545689475689748574385743765874585743857843765893748643587438957458754376543265874387564384764367584375874758943267632487564357 54545454123
6777744348435743587643756438765436574587564354375674365645643675 23232    
3875843654376574357 54545454

输出量

6
3
5
9

约束条件

  • 请勿使用任何内置函数或重载运算符来计算A B(您实际上根本不需要计算它)。
  • 最短的解决方案获胜!

2
是否可以使用幂运算符来计算A ** B以外的内容?
Lowjacker 2011年

我假设A和B均为非负数?
aaaaaaaaaaaaaa

Answers:


9

J-52个字符

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

通过给定的所有测试,尽管仅当删除第三个输入上的尾随空格时才有效(我猜这是无意的)。

解决方案将在控制台模式下的j602中工作(例如,在终端,emacs j-shell等中)。在j701中将无法使用(否wd)。

说明与数学:

“幻数” 12是在其他答案中找到的“最后一位”表的长度的LCM。所有数字都以周期1,2,3或4重复,因此它们也将以周期12重复。加12可以解决b mod 12 = 0的情况。我的解决方案计算(A的最后一位)^(12+(B mod 12)),并给出与最后一位相同的数字。(我考虑了一个偷偷摸摸的解决方案,通过使用例如B mod 96消除了三个字符“ 12+”的方式,其中没有示例可能发生冲突...)


6

的Python 125 107个字符

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]

不错+1。
Quixotic

6

高尔夫脚本21

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

这基本上计算出A^C mod 10C在范围内[1,4]C mod 4 = B mod 4,除非B为0,则C也为0。

此快捷方式是可能的,因为A^(B+4) mod 10 = A^B mod 10对于任何非负整数A和正整数B。


5

J,79

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

哇,真丑!提醒我不要学习这种语言。+1以忍受它。
Caleb

5

Ruby,97 93 72 71 67 61 60

还处理b == 0的情况。

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

猜猜实际上使用查询表会更糟。


2 5输入为1时输出为1,对于上述示例情况甚至没有给出正确的输出。ideone.com/2cOPy
fR0DDY 2011年

1
@ fR0DDY:它也可以在我的系统上完美运行,也可以使用1.9.2。
Lowjacker

4

Windows PowerShell,85

O(1)解决方案。摘自Lowjacker的Ruby解决方案;-)

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

3

Python 149个字符

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

蟒(119 134 109)

我相信禁止内置功能的禁止不适用于I / O。

导入系统
p =λb,e:e和p(b * b%10,e / 2)*(〜e&1or b)%10或1
对于sys.stdin中的l:print p(* map(int,l.split()))

编辑:删除对Python的幂运算符的使用。

编辑:用短路的布尔运算符替换了三元运算符。


是的,您可以/必须使用I / O功能来获取输入,但不应为此任务使用“ **”。
Quixotic

虽然可以,但是可以,但是我并不是真的打算将这个任务用于强力的模块化幂运算解决方案,实际上有一个O(1)算法,而且它也很短:-)
Quixotic

2

Python 3k

121个字符

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

(a*a)%10是没有必要的,但其加速,因此决定保留它。

编辑:显然,不需要括号。

同时,考虑O(1)解决方案。:)


EOF之后不会出现循环错误吗?
Hoa Long Tam

2

Javascript(117 84 79 60个字符)

@JiminP和@NoOneIsHere的建议改进达到了60个字符。谢谢!

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

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

去测试:

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

结果:

2
3
5
9

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

1
我使用JavaScript的程度不高,但是您不能使用d=s,n=>(Math.pow(s.slice(-1),n%4||1)+'').slice(-1)或完全不使用=>吗?
NoOneIsHere
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.