8

Python の宿題で、「正の整数を入力として取り、入力値までのすべての整数の乗算を示す乗算表を出力する」関数を作成するように求められます (while ループも使用)。

 # This is an example of the output of the function
print_multiplication_table(3)
>>> 1 * 1 = 1
>>> 1 * 2 = 2
>>> 1 * 3 = 3
>>> 2 * 1 = 2
>>> 2 * 2 = 4
>>> 2 * 3 = 6
>>> 3 * 1 = 3
>>> 3 * 2 = 6
>>> 3 * 3 = 9

始め方はわかったけど、次に何をすればいいのかわからない。アルゴリズムの助けが必要です。私は学びたいので、正しいコードを書かないでください。代わりに、論理と推論を教えてください。 これが私の推論です:

  1. この関数は、すべての実数に、指定された値 (n) に n より 1 を掛けた値、または (n-1) を乗算する必要があります。
  2. この関数は、すべての実数を n(n を含む) x n の 2 倍または (n-2) に乗算する必要があります。
  3. この関数は、すべての実数を n(n を含む) x n の 3 倍、または (n-3) などに乗算する必要があります... n に到達するまで
  4. 関数が n に達すると、関数はすべての実数を n (n を含む) x n に乗算する必要があります。
  5. その後、関数は停止するか、while ループで「ブレーク」する必要があります。
  6. 次に、関数は結果を出力する必要があります

だから、これは私がこれまで持っているものです:

def print_multiplication_table(n): # n for a number
    if n >=0:
        while somehting:
            # The code rest of the code that I need help on

    else:
        return "The input is not a positive whole number.Try anohter input!"

編集:みんなからの素晴らしい回答の後に私が持っているものは次のとおりです

"""
i * j = answer
i is counting from 1 to n
for each i, j is counting from 1 to n 
"""


def print_multiplication_table(n): # n for a number
    if n >=0:
        i = 0
        j = 0 
        while i <n:
            i = i + 1
            while j <i:
                j = j + 1
            answer = i * j
            print i, " * ",j,"=",answer

    else:
        return "The input is not a positive whole number.Try another input!"

まだ完全には終わっていません!例えば:

print_multiplication_table(2)
# The output 
>>>1  *  1 = 1
>>>2  *  2 = 4

そして、そうではありません

>>> 1 * 1 = 1
>>> 1 * 2 = 2
>>> 2 * 1 = 2
>>> 2 * 2 = 4 

私は何を間違っていますか?

4

3 に答える 3

4

Python ではループの方が適しているwhileため、ループの要件については少し不満があります。forでも勉強は勉強!

考えましょう。なぜするのWhile Trueですか?それは break ステートメントなしでは決して終了しません。これはちょっと不自由だと思います。別の条件はどうですか?

変数はどうですか?2つ必要かもしれないと思います。乗算する数値ごとに 1 つ。そして、必ずwhileループに追加してください。

さらにヘルプが必要な場合は、この回答に追加していただければ幸いです。

あなたの論理はかなり良いです。しかし、ここに私の要約があります:

2 つの数値の積が のときにループを停止しますn * n

それまでの間、各数字とその積を印刷してください。最初の数字が n でない場合は、インクリメントします。それが n になったら、2 番目の値をインクリメントし始めます。(これは if ステートメントで行うこともできますが、ネストされたループの方がよいでしょう。) 両方が n の場合while、条件が満たされるため、ブロックが壊れます。

あなたのコメントによると、ここにちょっとしたヒントの疑似コードがあります:

while something:
    while something else:
        do something fun
        j += 1
    i += 1

i と j の元の割り当てはどこに行くべきですか? 何か、何か他のもの、そして楽しいものとは何ですか?

于 2013-08-23T00:19:09.600 に答える
2

特定の出力を生成できるようになるための最初のステップは、その出力のパターンを認識することです。

1 * 1 = 1
1 * 2 = 2
1 * 3 = 3
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9

の右側の=数値は、各行の他の 2 つの数値を乗算することで計算できるため、決定するのは簡単です。それらを取得することが課題の核心です。の 2 つのオペランドを 2 つのカウンターと考えて、 と と*呼びましょう。は からまでカウントされますが、は から までカウントされます(合計 9 行になります。より一般的には n 2行になります)。したがって、ネストされたループを使用してみてください。1 つはループ(からへ) で、もう 1 つはループ(からへ) です。iji13 ij13i1nj1ni. ネストされたループの各反復で、 を含む文字列をi目的ji*j形式で出力できます。

于 2013-08-23T00:21:41.783 に答える
2

この問題は、2 つのカウンターがあるため、ネストされたループを使用して実装することをお勧めします。最初に、2 つのカウンターの制限 (開始値、終了値) を把握します。関数の開始時にカウンターを下限に初期化し、while ループで上限をテストします。

于 2013-08-23T00:19:30.237 に答える