66

課題のために解決しなければならない問題がいくつかあり、少し行き詰まっています。問題は、ユーザーに奇数を入力させ (奇数であることを確認してください)、入力のサイズに基づいて逆さまの星のピラミッドを出力するプログラムを作成することです。

たとえば、5 を入力すると、

*****
 ***
  *

したがって、私の問題は 2 つあります。

1) 偶数か奇数かを確認するにはどうすればよいですか? 私はif number/2 == intそれが何かをするかもしれないことを期待して試してみました. インターネットは私にそうするように言っていますが、それはうまくいきif number%2==0ません.

2) 各行の途中にあるアスタリスクを変更するにはどうすればよいですか?

いずれかの問題に関するヘルプは大歓迎です。

4

18 に答える 18

95

これは宿題であるため、完全な回答を提供しても意味がありません。そのため、いくつかのヒントを次に示します。

偶数または奇数:

number % 2 == 0

間違いなくあなたの数が偶数かどうかを見つけるための非常に良い方法です.

ご存じない場合、これはによる%除算の剰余であるモジュロを行います。http://en.wikipedia.org/wiki/Modulo_operationnumber2

ピラミッドの印刷:

最初のアドバイス: を印刷する*****には、 を実行できますprint "*" * 5

2 番目のアドバイス: アスタリスクを中央に配置するには、アスタリスクの前に何個のスペースを書き込む必要があるかを調べる必要があります。次に、一連のスペースとアスタリスクを印刷できますprint " "*1 + "*"*3

于 2012-11-29T23:32:28.497 に答える
25

%2 を使用した法 2 の解は適切ですが、除算と減算が必要です。コンピューターはバイナリ演算を使用するため、より効率的なソリューションは次のとおりです。

# This first solution does not produce a Boolean value. 
is_odd_if_zero = value & 1

# or

is_odd = (value & 1) == 1

# or

is_even = (value & 1) == 0
于 2016-05-20T19:00:34.223 に答える
12

ここでのソリューションのいくつかは、さまざまな「偶数」操作、具体的にはn % 2vsn & 1にかかる時間を参照していますが、これが のサイズによってどのように変化するかを体系的にチェックすることはなくn、速度を予測することがわかります。

簡単に言えば、適切なサイズの数値 (通常は < 1e9 ) を使用している場合、大きな違いはありません。より大きな数値を使用している場合は、おそらくビット単位の演算子を使用する必要があります。

これは、何が起こっているかを示すプロットです (Linux 5.1.2 で Python 3.7.3 を使用):

python3.7 ベンチマーク

基本的に、「任意精度」の長さに達すると、モジュラスの処理が徐々に遅くなりますが、ビット単位の操作は一定のままです。また、これの乗数に注意してください10**-7。つまり、1 秒あたり約 3,000 万 (小さな整数) チェックを実行できます。

Python 2.7.16 の同じプロットを次に示します。

python2.7 ベンチマーク

これは、新しいバージョンの Python に導入された最適化を示しています。

私のマシンにはこれらのバージョンの Python しかありませんが、興味のある他のバージョンの Python を再実行することができます。n1 と 1e100 の間に 51 の s があります(対数スケールで等間隔)。

timeit('n % 2', f'n={n}', number=niter) 

ここで、約 0.1 秒かかるようniterに計算されtimeit、これが 5 回繰り返されます。の扱いが少し厄介なのnは、ローカル変数よりも遅いグローバル変数ルックアップのベンチマークも行わないようにすることです。これらの値の平均が線の描画に使用され、個々の値がポイントとして描画されます。

于 2019-05-21T14:07:12.230 に答える
6
if number%2==0

それが均等であるとあなたに言うでしょう。したがって、奇数はそこでのelseステートメントになります。「%」は、除算後に余りを返すmod記号です。つまり、基本的に、数値が2で割り切れる場合は、偶数であると安全に想定できます。そうでなければ、それは奇妙です(それは完全な相関関係です!)

アスタリスクの配置については、アスタリスクの前に、その行に関連付けられているスペースの数を追加します。あなたの例では

***** line 0
***   line 1
*     line 2

それに応じてスペースを空けたい

0*****
01***
012*
于 2012-11-29T23:32:29.467 に答える
6

1)偶数か奇数かを確認するにはどうすればよいですか?何かができることを期待して「ifnumber/2 == int」を試しましたが、インターネットから「if number%2 == 0」と言われましたが、うまくいきません。

def isEven(number):
        return number % 2 == 0
于 2012-11-29T23:31:01.700 に答える
3

最も簡単で基本的な方法はこれだと思います

import math

number = int (input ('Enter number: '))

if number % 2 == 0 and number != 0:
    print ('Even number')
elif number == 0:
    print ('Zero is neither even, nor odd.')
else:
    print ('Odd number')

基本的な条件と数学だけです。また、偶数でも奇数でもないゼロを気にし、入力によって必要な数値を指定するため、非常に可変です。

于 2016-10-05T11:16:17.617 に答える
3
la = lambda x : "even" if not x % 2 else "odd"
于 2016-02-13T16:27:58.800 に答える
1

印刷に関しては、Format Specification Mini Languageを使用して行う方法を次に示します(セクション:テキストの配置と幅の指定):

長さがわかったら、次のように言いますlength = 11

rowstring = '{{: ^{length:d}}}'.format(length = length) # center aligned, space-padded format string of length <length>
for i in xrange(length, 0, -2): # iterate from top to bottom with step size 2
    print rowstring.format( '*' * i )
于 2012-11-29T23:39:35.067 に答える
1

これが私の解決策です:

def is_even(n):
    r=n/2.0
    return True if r==int(r) else False
于 2016-09-12T02:03:45.550 に答える
1

int 値が奇数か偶数かを確認する方法はたくさんあります。主な方法を 2 つ紹介します。

number = 5

def best_way(number):
    if number%2==0:
        print "even"
    else:
        print "odd"

def binary_way(number):
    if str(bin(number))[len(bin(number))-1]=='0':
        print "even"
    else:
        print "odd"
best_way(number)
binary_way(number)

それが役に立てば幸い

于 2015-06-07T13:52:06.080 に答える