2的幂的后k位


16

对于任何整数,都有一个2的幂,最后一个位数为1或2。[R[R

给定,找到最小的,使得仅包含1或2。[RX2X10[R

对于[R=2X=9,因为29=512
对于[R=3x=89,因为289=618970019642690137449562112
注意:r=4x=89(再次)

输入:r100

输出:x

例如。

输入:2
输出:9

输入:3点
:89

该程序应在合理的时间内运行。

编辑:此挑战的oeis序列是A147884


2
该OEIS这个任务是A147884
堂吉诃德式的

@Debanjan,是的。@ S.Mark,2的幂,而不是3
st0le

我有一篇论文,描述了一种有效的算法。如果有人无法继续前进,我将其发布。
st0le 2011年

啊,好的,谢谢!

@ st0le:复杂吗?
whacko__Cracko 2011年

Answers:


4

Python,166个字符

k,f,g=1,4,16
i=j=2
n=input()
m=10**n
a=lambda c:c('')-1-i or c('1')+c('2')-c('')+1
while i<=n:
 while a(str(j)[-i:].count):j,k=j*g%m,k+f
 i,g,f=i+1,g**5%m,f*5
print k


您可以使用分号保存一些字节:161个字节
movatica

2

Wolfram语言(Mathematica)78 76 57 55字节

(x=0;While[Max@Abs[2IntegerDigits[2^++x,10,#]-3]>1];x)&

在线尝试!

IntegerDigits[a,10,r]生成的r最后十进制数字的列表a。减去3/2并检查它们是否均为-1/2或+1/2。

定时检查:在TIO上20秒r = 1 .. 10

Wolfram语言(Mathematica)102 95 91 89字节

k/.FindInstance[Mod[n=0;Nest[#+10^n(2-Mod[#/2^n++,2])&,0,#]-2^k,5^#]==0,k,Integers][[1]]&

在线尝试!

该解决方案更长,但速度更快。通过采用OEIS A147884中建议的路径通过OEIS A053312并使用FindInstance魔术,TIO可以r = 1 .. 12在不到一分钟的时间内完成计算。


1

红宝石-118个字符

k,f,g,m=1,4,16
i=j=2
m=10**(n=gets.to_i)
((k+=f;j=j*g%m)until j.to_s=~%r{[12]{#{i}}$};i+=1;f*=5;g=g**5%m)until n<i
p k

1

Haskell,115个字符

import List
main=readLn>>=print. \r->head$findIndices(all(`elem`"12").take r.(++cycle"0").reverse.show)$iterate(*2)1


1

05AB1E18 15 字节

∞.Δo©‹®I.£2X:`P

在线尝试验证前8个测试用例(不再超时)。

说明:

2X>[R[R2X

∞.Δ            # Find the first positive integer x which is truthy (==1) for:
   o           #  Take 2 to the power the integer: 2^x
    ©          #  Store it in variable `®` (without popping)
              #  Check that it's larger than the (implicit) input: r < 2^x
               #  (1 if truhy; 0 if falsey)
    ®          #  Push variable `®` again: 2^x
     I       #  Only leave the last input amount of digits
        2X:    #  Replace all 2s with 1s
           `   #  Push all digits separated to the stack
    P          #  Take the product of all digits on the stack (including the earlier check)
               #  (NOTE: Only 1 is truthy in 05AB1E)

0

CSharp-111个字符

int a(int r){int x=1;a:x++;foreach(var c in Math.Pow(2,x)%Math.Pow(10,r)+"")if(c!='1'&&c!='2')goto a;return x;}


0

朱莉娅 133122(51)字节

受到您的回答启发:

n->(k=1;f=4;g=big(16);i=j=2;m=10^n;while i<=n;while digits!(fill(0,i),j)⊈1:2;j,k=j*g%m,k+f;end;i,g,f=i+1,g^5%m,f*5end;k)

在线尝试!

以下内容要短得多,但是像其他一些答案一样,它在r> 8时崩溃:

f(r,x=big(1))=digits!(fill(0,r),x)⊈1:2&&f(r,2x)+1

在线尝试!

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.