2 के शक्तियों का अंतिम k अंक


16

किसी भी पूर्णांक आर , 2 की एक शक्ति मौजूद है, जिनके अंतिम आर अंक 1 या 2 हैं।

आरएक्स2एक्सआधुनिक10आर

के लिए , , के बाद से के लिए , , के बाद से नोट: के लिए , है (फिर)आर=2एक्स=929=512
आर=3एक्स=89289=618970019642690137449562112
आर=4एक्स=89

इनपुट:आर100

आउटपुट:एक्स

उदाहरण के लिए।

इनपुट: २
ऊपुत: ९

इनपुट: 3
ऊपुत: 89

कार्यक्रम उचित समय पर चलना चाहिए।

EDIT: इस चुनौती के लिए oeis अनुक्रम A147884 है


2
इस कार्य के लिए OEIS A147884
Quixotic

@ डिबंजन, हाँ सच। @ S.Mark, 2 की शक्तियां, 3. नहीं
st0le

मेरे पास एक पेपर है, जो एक कुशल एल्गोरिदम का वर्णन करता है। अगर कोई इसके साथ आगे नहीं बढ़ सकता है तो मैं इसे पोस्ट करूँगा।
st0le

आह, ठीक है, धन्यवाद!
यू

@ st0le: जटिलता?
whacko__Cracko

जवाबों:


4

पायथन, 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

महान काम, मार्क :) मुझे लगता है कि आपने इसे पाया :)
st0le

आप अर्धविराम का उपयोग करके कुछ बाइट्स बचा सकते हैं: 161 बाइट्स
movatica

2

वोल्फ्राम लैंग्वेज (गणितज्ञ) , 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 हैं।

समय जाँच: 20 सेकंड के लिए टीआईओ पर r = 1 .. 10

वोल्फ्राम भाषा (गणितज्ञ) , 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 A053312 के माध्यम से जाने के लिए OEIS A147884 में सुझाए गए मार्ग को अपनाते हुए , साथ ही साथ 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

05AB1E , 18 15 बाइट्स

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

इसे ऑनलाइन आज़माएं या पहले 8 परीक्षण मामलों (किसी भी अधिक समय) को सत्यापित करें

स्पष्टीकरण:

2एक्स>आरआर2एक्स

∞.Δ            # 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

जूलिया 133 122 (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

इसे ऑनलाइन आज़माएं!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.