2012-11-30 90 views
0

來自我找到的書中的一個問題。搜索兩個整數根** pwr =整數(用戶輸入)

編寫一個程序,要求用戶輸入的整數,並且打印兩個 整數,根和PWR,使得0 < PWR < 6和根** PWR等於 爲輸入的整數用戶。如果不存在這樣的對,則打印它是不可能找到這樣一對的 。

integer = 3 #there will be raw_input but I use it as an example 
root = 0 

for pwr in range(1,6): 

    if root**pwr != integer: 
     pwr += 1 
     print pwr 

    else: 
     print root, pwr 

    if pwr > 5:  
     pwr = 1 
     root += 1 

我沒有完整的計劃還沒有,因爲我無法得到正確的循環。問題是我收到輸出2,3,4,5,6,然後循環終止。但是,我在最後一個if語句代碼塊中使用了pwr變量的重新啓動。但是,無論如何,它會停止執行。這裏有什麼問題?

+5

呃,'整數** 1'? – amit

+0

amit,整數將像integer = int(raw_input('Enter integer:'));我不知道整數用戶輸入。但我以此爲例。取3.我檢查根** pwr到6,並看到0 ** pwr不等於整數,因爲我不能超過6,我重置pwr,加1到root並重復...:]但循環失敗。 – Contempt

回答

1

另一種選擇,具有「簡單的數學」。

integer = 3 

for power in range(1,6): 
    a = (integer ** (1.0/power)) 
    if math.ceil(a) == a: 
     print a, power 

>> 3.0 1 
1

integer ** 1總是滿足條件。

替代(假設你真的想1 < pwr < 6):

檢查是否有一定的基礎a等一批nceil(a ** log_a(n)) == n。如果是這樣 - 那麼a ** log_a(n)是你的答案。
重複所有可能的a的範圍。

(在這裏log_a(n)與基部的,其可以被計算爲log(n)/log(a)對數)

+0

我想知道爲什麼我的循環不會繼續運行!我使用pwr = 1並重新設置了值。它現在在1到6的範圍內,因此必須運行。但事實並非如此。我瞭解你在這裏展示的數學,但我讀了麻省理工學院的書,並希望現在逐漸用更簡單的數學來建立基礎。謝謝。 – Contempt

+0

你不需要對此進行logorithms。 'root ** pow == integer' iff'root == integer **(1.0/pow)'。如果'root == int(root)'這個解決方案是一個整數。假設'1 agf

2

通常,修改循環內循環的內容並不是一個好主意。當您使用它來遍歷range(1,6)時,沒有理由撥動pwr

你的代碼試圖做的是對的pwr連續值測試root ** pwr == integerroot直到pwr一個固定值達到6.然後,你希望它添加一個root和重複。這是最自然地表述爲兩個嵌套的for循環:

for root in range(0,integer): 
    for pwr in range(1,6): 
     if root ** pwr == integer: 
      print root, pwr 

在任何情況下,這是一個相當昂貴的方式去了解它,所以我會建議尋找到這裏的一些其他的解決方案。但是,您應該記住這一點,因爲這是如何使用for循環的一個很好的示例。

要回答你爲什麼循環終止的問題,你必須考慮python如何處理迭代器。當for循環中的代碼塊終止時,python將pwr設置爲由迭代器next()方法返回的值(它的確如你所想的那樣)。當迭代器中沒有更多值時next()將引發StopIteration異常,Python將退出循環。關鍵是Python不會通過每次迭代添加1來修改pwr的值,它會覆蓋該值。所以,你循環將運行整整5倍,因爲這是多少個項目中有range(1,6)

爲了澄清運行下面的代碼:

for i in range(0,9): 
    print i 
    i += 5 
    print i 
+0

是的,我在這裏看到高度複雜的算法。當然,如果您想要速度,不是解決問題的最佳方法。 :D但仍然,爲什麼重置pwr爲1後,我的循環停止執行?這對我很重要,我無法理解這一點。誰能解釋一下? – Contempt

+0

太好了,非常感謝。 :]這意味着我在這個循環中用完了迭代,當它達到時,循環將終止並且對可迭代變量的修改不會影響循環。 – Contempt

0

這是手指操從介紹的」第3章計算和編程由約翰·加塔使用Python」和讀取:

編寫一個程序,要求用戶輸入的整數並打印兩個整數,根和PWR,使得0 < PWR < 6和根** PWR等於整數由用戶輸入。如果不存在這樣的對,它應該打印一個消息來達到這個效果。

鑑於作者指出可能不存在對,我認爲pwr的條件應該是1 < pwr < 6否則總會有解決方案(整數** 1)。我的回答,只使用了本書的那點被引入的概念,就是:

num = int(raw_input('Enter a positive integer: ')) 
pwr = 2 
root = 1 
ans = '' 
while pwr < 6: 
    while root**pwr <= num: 
     if root**pwr == num:  
      print 'the root is ',root, 
      print 'the power is ', pwr 
      ans = True 
     root += 1   
    pwr += 1 
    root = 1 
if ans != True: 
    print'No such pair of integers exist' 
0

首先,如果我們輸入一個整數,例如1024,那麼我們有1024^1 = 1024。於是就有了始終是解決問題的辦法:

n = int(input('Enter an integer: ')) 
pwr = 1 
root = 1 
found = False 

while root <= n: 
    if root**pwr == n: 
     print('root =',root, 'pwr =', pwr) 
     found = True 
    pwr = pwr + 1 
    if pwr == 6: 
     pwr = 1 
     root = root + 1 

if not found: 
    print('No such pair exist.') 
0

這是一個基於archery1234提交的答案。感謝archery1234,我對這個很新,我沒有幫助就無法開始。我喜歡所提供的答案,因爲它只使用了本書中介紹的概念,所以我覺得它接近Dr. Guttag可能希望我們學習的內容(while while循環內的while循環)。下面的代碼滿足的條件,0 < PWR < 6沒有永遠只是在整數終止進入爲根,PWR = 1

integer = abs(int(raw_input("Enter an integer: "))) 
pwr = 1 
root = 2 
ans = ' ' 
if abs(integer) == 1: 
    print "No such pair of integers exists" 
else: 
    while root < abs(integer): 
     while root**pwr <= integer: 
      if root**pwr == integer: 
       print "The root is ",root,";" 
       print "The power is ",pwr,"." 
       ans = True 
      pwr += 1 
     root += 1 
     pwr = 1 
    if ans != True: 
     print "No such pair of integers exist" 
0

我工作的這個問題,我的回答工作:

number = int(raw_input("Enger a number: ")) 
    i = 1 

    pwr = 1 
    test = 0 
    while i <= number/2: 
     while pwr < 6: 
      if i ** pwr == number: 
       print i 
       test = 1 
      pwr = pwr + 1 
     i = i + 1 
     pwr = 1 
    if test == 0: 
     print 'no' 
0

這就是我的回答:

usr = int(raw_input("Enter an integer > ")) 
paired = False 
for pwr in range(1,6): 
    root = 0 
    while (usr - root**pwr > 0): 
     root += 1 
    if usr == root**pwr: 
     paired = True 
     print "root is " + str(root) + " and ", 
     print "power is " + str(pwr) 
     break 
if paired == False: 
    print "No pair" 
0

我已成功地解決了這個問題,你從了第1章博增益,直到3.1的知識通過Gattug確定。這個手指鍛鍊讓我花了兩個星期的時間去做。我也剛剛開始編碼。

這裏是我的解決方案:

num = int(raw_input('Enter an integer: ')) 
root = num 
power = 1 

if root**power == abs(num): 
    print ' First pair of integers which equal the integer:', num, 'is root = ', root, 'power = ', power 
    root -= 1 
while root**power != abs(num) and root > 0: 
while power < 6 and root**power != abs(num): 
     if not(root**power == abs(num)): 
     power +=1 
     if not(root**power == abs(num)): 
     power +=1 
if power >= 6 and root**power != abs(num): 
    power = 1 
    root -= 1 
if root**power == abs(num): 
print 'Second pair of integers which equal the integer:', num, 'is root = ', root, 'power = ', power 
elif root**power != abs(num) and root == 0: 
print ' there is no other pair of integers that equal', num 

我已經做到了,這是教教你編碼

2

正如其他人所指出的最好的書,這是指鍛鍊3.1節(上詳盡枚舉)計算和編程入門使用Python約翰古塔格的Python,這是大規模開放在線課程MITx: 6.00.1x Introduction to Computer Science and Programming Using Python的教科書。教科書和課程使用Python 2.7

我還沒有足夠高的知名度來評論其他答案,所以請允許我在發佈此消息時寫下我的回答,以前發佈的答案都是錯誤或不完整的,據我所見。其他答案中的一個常見錯誤是他們不考慮所有整數。正確的程序應該解決所有整數的問題,包括正整數和負整數以及零(zero is also an integer)。

在此之前行使Guttag的書,我們已經介紹到while循環而不是for循環也不是range功能,這兩者將在下一節介紹。這裏是我的回答,只使用了本書中引入的概念,這個練習之前:

num = int(raw_input("Enter an integer: ")) 
pwr = 1 
root = 0 
found = False 
if num < 0: 
    neg = True 
else: 
    neg = False 
while pwr < 6: 
    while abs(root**pwr) <= abs(num): 
     if root**pwr == num: 
      print(str(root) + "**" + str(pwr) + " = " + str(num)) 
      found = True 
     if abs(root) > abs(num): 
      root = 0 
     elif neg: 
      root -= 1 
     else: 
      root +=1 
    pwr += 1 
    root = 0 
if not found: 
    print("No pair of integers, 'root' and 'pwr', exists such that 0 < pwr < 6 and root**pwr = " + str(num)) 

我已經測試此代碼整數0,1,-1,-2,8, -8和其他一些整數,它似乎工作。

0

試圖做到這一點,而不重新制定手指運動的規範,只使用本書介紹的內容 - 這對積極和消極的整數的作品,並且,據我所知,它會列出所有可能的配對,包括root = number,pwr = 1。其中一個關鍵似乎是在正確的地方使用abs,並確保如果用戶整數爲負值,則將root設置爲負數。希望這可以幫助像所有其他深思熟慮的貢獻幫助我。

num = int(raw_input('Enter an integer: ')) 
pwr = 1 
root = 1 
ans = '' 
while pwr < 6: 
    while root**pwr <= abs(num): 
     if root**pwr == abs(num): 
      if num<0: 
       root=-root 
     print 'the root is ',root, 'the power is ', pwr 
     ans = True 
     root= abs(root)+1 
    pwr += 1 
    root = 1 
if ans != True: 
    print'No such pair of integers exist' 
0

我是自學python,我的解決方案如下。

num = int(input('Please enter integer: ')) 
list= [] 
list1=[] 
for root in range (0,num): 
    for pwr in range (1,6): 
     if root**pwr == num: 
      list.append([root,pwr]) 
     else: 
      list1.append(0) 
if list ==[]: 
    print ('No root exist') 
else: 
    print (list) 

我創建了列表來保存所有的根和pwrs。

0

正如其他人所說,這是由約翰·加塔一個手指操介紹計算和PROGRAMM使用Python

雖然上述的一些反應的可能工作(坦率地說,我還沒有測試),更簡單的方法將產生所期望的結果以及容納負整數,例如:

x = int(input("Enter an integer: ")) 
root = 0 

while root < abs(x): 
    root += 1 
    for pwr in range(1,6): 
     if root ** pwr == abs(x): 
      if x < 0: 
       print(-root, "to the power of", pwr, "=", x) 
      else: 
       print(root, "to the power of", pwr, "=", x) 
1

我一個邏輯錯誤,在試圖弄清楚它可能是什麼時,我浪費了很多時間,我認爲這可能是一個常見的錯誤。我忘了在外部循環中重置pwr的值。

這是當前版本:

root=0 
pwr=1 
check=0 
integer=int(input('Enter the number:')) 
while(root**pwr<abs(integer)): 
    while(pwr<6): 
     if root**pwr==abs(integer): 
      check=1 
      print('Root =',root,'or -'+ str(root),'and Power =',pwr) 
     pwr+=1 
    root+=1 
    pwr=1 #<--------------Resetting pwr to 1 inside the outer loop 
if check!=1: 
    print('No such combination exists') 

我希望這有助於節省一些時間。

0

我很享受Pragu的解決方案,但我認爲它有所改進。如果解決方案以最低價格結束,例如在Pragu的解決方案中找到解決方案,我會停止它,16將返回2^3和4^2這是真正的答案。我已經把自己的非零部分放進去了,並且用它來解決它,但是實際上,正如布魯那般雄辯地說,我們還沒有在書中得到它。這就是我所做的。

# -*- coding: utf-8 -*- 
""" 
Created on Sat Jan 13 12:03:09 2018 

@author: chief 
""" 

import random #this imports the random function 
mysteryNumber = int(input('Please enter a non-zero positive integer: ')) #give me input Seymour! 
if mysteryNumber <= 0: #did they give me a non-zero positive integer? 
    print("that wasn't a non-zero positive integer doofenshmirtz!! I'll fix that for you") #Carl would understand 
    if mysteryNumber < 0: #make it a positive integer 
     mysteryNumber = -mysteryNumber 
    if mysteryNumber == 0: #make it a non zero integer by generating random number 
     mysteryNumber = random.randint(1,100) 
print ('Your number is', mysteryNumber) 
root=0 #set the variables or clear the pallet if you will 
pwr=1 
check=0 

while(root**pwr<abs(mysteryNumber)): #first while loop 
    while(pwr<6) and check == 0: # this and logical stops it at the earliest answer otherwise 16 will give you two answers as will 81 
     if root**pwr == abs(mysteryNumber): #if then loop checks did you find the answer, if yes then next 2 lines are active, if no then to the else line 
      check=1 
      print('The root =',root,'or -'+ str(root),'and Power =',pwr, 'will yield', mysteryNumber) 
     pwr+=1 #else line, adds 1 to the pwr and moves back to the while statement of while<6 
    root+=1 #While pwr <6 is done so we go onto the next root 
    pwr=1 #<--------------Resetting pwr to 1 inside the outer loop 
if check!=1: #the first while is done now, if we found an answer this argument returns false and the line below doesn't get executed 
    print('No rational combination of root and power exists for', mysteryNumber) 
0
number = int(raw_input("Enter a number: ")) 
pwr = 1 
root = 2 

while root < number: 
    pwr = 1 
    while pwr < 6: 
     if root*pwr == number: 
      print'Numbers are', (root, pwr) 
     pwr += 1 
    root += 1 
    print('No such numbers') 
+3

這可能是一個正確的解決方案,但您沒有向提問者提供任何關於他們的方法出了什麼問題的解釋。 – niko