3

見つけた本からの質問です。

ユーザーに整数を入力するように要求し、0 < pwr < 6 で root**pwr がユーザーが入力した整数と等しくなるように、root と pwr の 2 つの整数を出力するプログラムを作成します。そのようなペアが存在しない場合は、そのようなペアを見つけることは不可能であることを出力してください。

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 変数で再起動を使用しました。ただし、とにかく実行を停止します。ここで何が問題なのですか?

4

25 に答える 25

2

一般に、ループ内でループしているものを変更することはお勧めできません。pwrそれを使用して反復する場合、いじる理由はありませんrange(1,6)

あなたのコードがしようとしているのはroot ** pwr == integer、 の連続する値pwrと の固定値が 6 に達するrootまでテストするpwrことです。次に、 に 1 を追加しrootて繰り返します。これは、ネストされた 2 つの for ループとして最も自然に表現されます。

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

いずれにせよ、これはかなり高価な方法なので、ここで他の解決策を検討することをお勧めします. ただし、これは for ループの使用方法の良い例であるため、覚えておく必要があります。

ループが終了した理由についての質問に答えるには、python がイテレータをどのように扱うかを考慮する必要があります。for ループ内のコード ブロックが終了すると、pythonpwrは iteratorsnext()メソッドによって返された値に設定されます (これはまさにあなたが考えていることを行います)。イテレータに残っている値がなくなるnext()と、StopIteration例外が発生し、Python はループを終了します。pwr重要なのは、Python が反復ごとに 1 を追加して値を変更するのではなく、値を上書きすることです。したがって、ループは正確に 5 回実行されます。range(1,6)

明確にするために、次のコードを実行します。

for i in range(0,9):
    print i
    i += 5
    print i
于 2012-11-30T16:10:30.040 に答える
2

「単純な数学」を使用した別のオプション。

integer = 3

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

>> 3.0 1
于 2012-11-30T16:05:57.067 に答える
1

integer ** 1常に条件を満たしています。

代替(実際に必要だと仮定1 < pwr < 6):

特定の基数aと数があるかどうかを確認しますn: ceil(a ** log_a(n)) == n. もしそうなら、それa ** log_a(n)があなたの答えです。
範囲内のすべての可能な について繰り返しaます。

(ここlog_a(n)では底 a の対数で、次のように計算できますlog(n)/log(a))

于 2012-11-30T15:34:50.970 に答える
1

他の人が言及したように、これは、John Guttag による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)
于 2017-12-15T15:15:37.203 に答える
0

この問題は、Gattug の本の第 1 章から 3.1 までの知識で解決できました。この指のエクササイズには2週間かかりました。私もコーディングを始めたばかりです。

ここに私の解決策があります:

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

私はそれをやったし、コーディングを教えるための最高の本です

于 2016-01-31T07:11:20.637 に答える
0

私はこの問題に取り組んでいました、私の答えはうまくいきます:

number = int(raw_input("Enter 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 such pair of integers exist.'
于 2015-01-18T19:30:14.013 に答える
0

これは、John Guttag による「Introduction to Computation and Programming Using Python」の第 3 章の指のエクササイズで、次のように書かれています。

ユーザーに整数の入力を求め、0 < pwr < 6 で root**pwr がユーザーが入力した整数と等しくなるように、root と pwr の 2 つの整数を出力するプログラムを作成します。そのようなペアが存在しない場合は、その旨のメッセージを出力する必要があります。

ペアが存在しない可能性があることを著者が示していることを考慮して、pwr の条件は 1 < pwr < 6 である必要があると想定しました。その時点までに本で紹介された概念のみを使用して、私の答えは次のとおりです。

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'
于 2014-03-14T00:41:52.023 に答える
0

これは、archery1234 による提出に基づく回答です。archery1234 のおかげで、私はこれに慣れていないので、助けなしでは始めることができませんでした. 本のその時点までに説明された概念のみを使用していたため、提供された回答が気に入ったため、Guttag 博士がおそらく私たちに学びたいと思っていたもの (while ループ内の while ループ) に近いと感じました。次のコードは、ルートおよび pwr = 1 として入力された整数で常に終了することなく、0 < pwr < 6 という条件を満たしています。

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"
于 2014-10-17T13:04:13.120 に答える
0

これは、最小限の初期化で可能なすべてのルートを提供し、Guttag テキストに従ってwhile ループのみを使用するため、より洗練されたソリューションである可能性があると思います。 ぜひお試しください。すべてのユースケースで機能すると思います。

root equals integer を使用してループを中断し、反復ごとに電力をリセットできるようにしました。これにより、while ループの過負荷が防止されます。(根 == 整数はべき乗が 1 の場合と同じ)

integer = int(input("Enter an integer please: "))
root = 0
pwr = 0
while root**pwr < abs(integer):
    root = root + 1
    while pwr < 6:
        pwr = pwr + 1
        if root**pwr == integer:
            print("Root:", root, ", Power:", pwr)
    if root == integer:
        break
    pwr = 0

整数 = 343 の出力:

ルート: 7、パワー: 3

ルート: 343、パワー: 1

于 2019-02-18T08:48:49.073 に答える
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 を保存するリストを作成しました。

于 2016-06-15T14:26:38.200 に答える
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"
于 2016-01-16T16:49:35.557 に答える