2011-01-28 15 views
8

में एक पत्र/संख्या की समस्या को हल करते हैं a = 15 और 152 जबकि 2152a के रूप में प्रस्तुत किया जाता है a2 के रूप में प्रस्तुत किया जाता है तो एक नंबर एक्स पाया जा सकता है इस तरह केकुशलतापूर्वक अजगर

8x = 8*x8

है कि मैं इस अनुभवहीन अजगर की कोशिश की कोड

>>> i = 0 
>>> while(i<=100000000000000000): 
... if(int("8"+str(i))==8*int(str(i)+"8")): 
...  break 
... i = i+1 
... print i 

लेकिन सही परिणाम देने में काफी समय लग रहा है।

कोड को अनुकूलित करने के लिए कैसे करें?

+1

को बदला जा सकता है कोड आपकी वर्तमान अनुकूलन करने के लिए कोशिश मत करो। इसके बजाए एक और एल्गोरिदम का प्रयोग करें। – Sjoerd

+0

क्या आप कृपया सुझाव दे सकते हैं कि कौन से एल्गोरिदम का उपयोग किया जाना है? –

उत्तर

10

थोड़ा गणित यहां सहायता करता है: xn अंकों के साथ एक प्राकृतिक संख्या हो। फिर 8x = 8 * 10^एन + एक्स, और x8 = 10 * x + 8. तो हल करने के लिए समीकरण 8 * 10^एन + एक्स = 8 * (10 * x + 8) = 80 * x + 64 , जहां x और n प्राकृतिक संख्याएं होनी चाहिए। यह तुरंत x = (8 * 10^एन -64)/79 का पालन करता है। अब हमें केवल यह जांचना है कि फॉर्म 8 * 10^एन -64 की संख्या किस प्रकार से विभाजित है 79, जो बहुत तेज़ है:

>>> n = 0 
>>> while True: 
...  y = 8 * 10**n - 64 
...  if y % 79 == 0: 
...   x = y/79 
...   break 
...  n += 1 
... 
>>> print x 
101265822784 
>>> print int("8"+str(x))==8*int(str(x)+"8") 
True 
+0

ध्यान दें कि यह सबसे कम संभव एल्गोरिदम है। यह बहुत सुधार किया जा सकता है (उदाहरण के लिए * * * से * अगले * वाई * की गणना करके घातीय, गणना विभाजन और शेष एक ही समय में गणना के बिना), लेकिन आप बिंदु प्राप्त करते हैं। – Philipp

+0

और अब जब एल्गोरिदम सरलीकृत है, तो मुझे कार्यान्वयन को सरल बनाने दें;) 'अगली ((8 * 10 ** एन -64) एन में गिनती (0) में (8 * 10 ** एन - 64)% 79 = = 0) '। – delnan

+0

आपकी मदद के लिए धन्यवाद एक टन। –

1

आपको str से int रूपांतरणों से छुटकारा पाने का प्रयास करना चाहिए।

सभी 8*int(str(i)+"8") पहले 8*(i*10+8) के रूप में लिखा जा सकता है और पहले भाग 8*(int(log(i)/log(10))+1) + i

संबंधित मुद्दे