2012-11-04 17 views
7

मैंने अभी पाइथन सीखना शुरू कर दिया है और अपने कौशल को खरीदने में मदद करने के लिए कुछ समस्याएं शुरू कर दी हैं, हालांकि मैं इस सवाल पर काफी अटक गया हूं।संख्याओं की सूची जिनके वर्ग दो वर्गों के योग हैं

एक सूची बनाएं जिसमें 1000 तक सभी सकारात्मक पूर्णांक शामिल हैं जिनके वर्गों को दो वर्गों के योग के रूप में व्यक्त किया जा सकता है, (i, e।, Integers p जिसके लिए p^2 = m^2 + n^2, जहां मी और n 0 से अधिक पूर्णांक हैं)

संकेत: कई दृष्टिकोण हैं। आपको सभी वर्ग संख्याओं की सूची रखने में मदद मिल सकती है। ऑपरेटर में उपयोगी हो सकता है।

यहाँ कोड है कि मैं अब तक के साथ आ गया है:

numbers=xrange(1001) 
    numbers_squared=[x**2 for x in numbers] 
    a=[] 

    for x in numbers_squared: 
     for b in numbers_squared: 
      if (x+b)**.5 <= 1001: 
       a.append(x+b) 
    print a 
समस्या मैं इस के साथ मिल

कि अजगर इन गणना करने के लिए (मैं लगभग दस मिनट इंतज़ार किया साल लग जाते हैं और यह अभी भी मुद्रण संख्या)। इसे हल करने के तरीके पर कोई संकेत बहुत सराहना की जाएगी।

पेज। मुख्य बिंदु सूचियों का उपयोग करना है। समाधान के मुकाबले संकेतों की भी अधिक सराहना की जाएगी।

धन्यवाद!

+0

ठीक है, एक के लिए, आप लूप के लिए दूसरे को x के नीचे संख्याओं तक सीमित कर सकते हैं। उदाहरण के लिए '8 ** 2 = 64'' 64' से अधिक किसी भी संख्या के योग के रूप में व्यक्त नहीं किया जा सकता है। –

+0

क्या आपने दिया है कि ऐसी संख्याएं कितनी हैं? – inspectorG4dget

+0

मैं सोच रहा था कि मुझे यकीन नहीं था कि वास्तव में पाइथन में इसे कैसे लिखना है। संकेत के लिए धन्यवाद: डी – Dizzle

उत्तर

2

कैसे एक सूची समझ के बारे में के लिए काम करता है? रेंज में ख के लिए रेंज (1,1011) में ग के लिए गणना (1, ग) रेंज में एक के लिए (1, ख)

इस प्रकार है:

x = [(a,b,c) for c in range(1,1001) for b in range(1, c) for a in range(1,b) if a**2+b**2==c**2] 
print x 

मैं इस समय समाप्त हो गया और है मेरे कंप्यूटर पर पूरा होने में 46 सेकंड लगते हैं

7

सबसे पहले, आप समस्या को हल नहीं कर रहे हैं। (x+b)**.5 वास्तव में एक पूर्णांक सुनिश्चित करने के लिए आपको एक चेक करने की आवश्यकता है। दूसरा, यदि आप प्रिंटिंग नंबर हैं, तो आप पहले से ही सभी संख्याओं की गणना कर चुके हैं। उपर्युक्त करने से इस चरण के लिए आवश्यक समय कम हो जाएगा।

+0

आह ठीक है। बहुत बहुत धन्यवाद: डी, ​​मुझे लगता है कि मैंने इसे तोड़ दिया है !! – Dizzle

+0

यह मूल रूप से पाइथाग्रेन ट्रिपल खोजने की समस्या है। बस 'सी' को '** ** + बी ** 2 = सी ** 2' में रखें। – Droogans

1

यह काम हो सकता है:

def isSumOfSquares(n): 
    """return True if n can be expressed as the sum of two squares; False otherwise""" 

    for a in xrange(1,n): 
     b = n-(a**2) 
     if b<=0: 
      return False 
     elif not math.sqrt(b)%1: 
      return True 
    return False 

answer = [i for i in xrange(1,1001) if isSumOfSquares(i**2)] 

मुझे पता है कि यह आपके

+0

मैंने कोशिश की और यह काम नहीं किया, ठीक करने के लिए कुछ बदलाव करने की कोशिश की और अभी भी नहीं। वैसे भी धन्यवाद :) – Dizzle

+0

मैंने इसे चलाया और [1, 1000] में 567 प्रविष्टियां प्राप्त कीं।यदि आप काम नहीं करते हैं, तो आप अधिक विशिष्ट हो सकते हैं, मैं इसे – inspectorG4dget

0

मैं बस answered this कहीं और!

import math 

def is_triple(hypotenuse): 
    """return (a, b, c) if Pythagrean Triple, else None""" 
    if hypotenuse < 4: 
     return None 

    c = hypotenuse ** 2 

    for a in xrange(3, hypotenuse): 
     b = math.sqrt(c - (a ** 2)) 
     if b == int(b): 
      return a, int(b), hypotenuse 

    return None 

>>> results = [x for x in range(1001) if is_triple(x)] 
>>> len(results) 
567 

लगभग तुरंत चलता है।

+0

को आजमा सकता हूं और इसे ठीक कर सकता हूं, मैं आपके कार्यान्वयन की गति से बहुत प्रभावित हूं, हालांकि आपको केवल एक समाधान पीआर हाइपोटिन्यूज मिलता है, और इसलिए आपकी अंतिम सूची पूर्ण से छोटी है समाधानों का सेट क्योंकि सी = 25 के लिए दो समाधान हैं: (15, 20, 25) और (7, 24, 25), मेरी सूची समझ का लेन 881 है क्योंकि इसमें सभी 'अद्वितीय समाधान हैं जहां jcr

+1

की गति से बहुत प्रभावित हूं ओपी का शीर्षक थोड़ा भ्रामक है: * उन संख्याओं की सूची जिनके वर्ग दो वर्गों के योग हैं * बनाम जो मैं पढ़ता हूं: * संख्याओं की सूची जिसका वर्ग ** है * * दो वर्गों का योग * – Droogans

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