python - 检查奇数/偶数并改变数字大小的输出

kei*_*tre 59 python numbers

我有一些问题要解决,我有点卡住了.问题是编写一个程序,让用户输入一个奇数(检查它是奇数),然后根据输入的大小打印一个倒置的星形金字塔.

例如,如果输入5,则会出现

*****
 ***
  *
Run Code Online (Sandbox Code Playgroud)

因此,我的问题是双重的.

1)如何检查它是偶数还是奇数?我试着if number/2 == int希望它可以做某事,而互联网告诉我这样做if number%2==0,但这不起作用.

2)如何更改每行中间的星号?

任何问题的任何帮助非常感谢.

Jul*_*not 88

给你完整的答案是没有意义的,因为这是家庭作业,所以这里有一些指示:

偶数或奇数:

number % 2 == 0
Run Code Online (Sandbox Code Playgroud)

绝对是一个很好的方法来查找你的号码是否均匀.

如果你不知道%,这样做模是这里的除法的余数number通过2.http://en.wikipedia.org/wiki/Modulo_operation

打印金字塔:

第一条建议:为了打印*****,你可以做到print "*" * 5.

第二条建议:为了使星号居中,您需要找出在星号之前要写入多少空格.然后你可以打印一堆空格和星号print " "*1 + "*"*3

  • @NullUserException取决于品味 - 而且更清晰(恕我直言)`('*'*3).中心(5)` (7认同)
  • 或者,您可以让Python居中,例如:`'{:^ 6}'。format('*'* 3)` (2认同)

小智 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
Run Code Online (Sandbox Code Playgroud)

  • 我查看了timeit.Timer(),看看有多少差别,如果有的话,我的机器上有一个(小于一个数量级)差异.使用value = sys.maxsize,1000000次运行它,方法和模数方法之间的差异大约为0.07秒,这有利于您的方法. (3认同)
  • @endolith:Python确实有一个优化器,但它不会优化常量的余数(或除法)。然而,CPython 确实有一个用于在“短”整数上计算“%”的快速路径,但不适用于按位运算符。因此,对于 30 位以内的整数(在 64 位系统上),“v%2”比“v&1”更快,而对于更长的整数则更慢。 (3认同)
  • 一个好的编译器应该知道`value mod 2 == 0`应该评估机器码中的LSB检查,不应该吗? (2认同)
  • @Jan:Python 没有编译器也没有优化器。这将会有所作为。 (2认同)

Sam*_*son 9

这里的一些解决方案引用了各种“偶数”操作所花费的时间,特别是n % 2vs n & 1,没有系统地检查它如何随 的大小变化n,结果证明可以预测速度。

简短的回答是,如果您使用大小合理的数字,通常 < 1e9,它不会有太大区别。如果您使用更大的数字,那么您可能希望使用按位运算符。

这是一个演示发生了什么的图(使用 Python 3.7.3,在 Linux 5.1.2 下):

python3.7 基准测试

基本上,当您达到“任意精度” longs 时,模数会逐渐变慢,而按位运算保持不变。另外,请注意10**-7乘数,即我每秒可以进行约 3000 万次(小整数)检查。

这是 Python 2.7.16 的相同图:

python2.7基准测试

这显示了新版本 Python 中的优化。

我的机器上只有这些版本的 Python,但可以重新运行其他版本的 Python。n在 1 和 1e100 之间有 51秒(在对数刻度上均匀分布),对于每个点,我做的相当于:

timeit('n % 2', f'n={n}', number=niter) 
Run Code Online (Sandbox Code Playgroud)

niter计算其中timeit需要约 0.1 秒,并重复 5 次。稍微有点尴尬的处理n是确保我们没有对全局变量查找进行基准测试,这比局部变量慢。这些值的平均值用于绘制线条,并将各个值绘制为点。


And*_*nko 8

简单但快速:

>>> def is_odd(a):
...     return bool(a - ((a>>1)<<1))
...
>>> print(is_odd(13))
True
>>> print(is_odd(12))
False
>>>
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

>>> def is_odd(a):
...   return bool(a & 1)
Run Code Online (Sandbox Code Playgroud)


d.m*_*ada 5

1)如何检查它是偶数还是奇数?我试过"如果数字/ 2 == int"希望它可以做某事,而互联网告诉我做"如果数字%2 == 0",但这不起作用.

def isEven(number):
        return number % 2 == 0
Run Code Online (Sandbox Code Playgroud)


Sup*_*Guy 5

if number%2==0
Run Code Online (Sandbox Code Playgroud)

会告诉你它甚至是.那么奇怪的数字就是那里的else语句."%"是mod符号,它在分割后返回余数.所以基本上我们说如果数字可以被2整除,我们可以安全地假设它是偶数.否则它很奇怪(这是一个完美的相关性!)

对于星号放置,您希望在星号前加上与其所在行相关的空格数.在你的例子中

***** line 0
***   line 1
*     line 2
Run Code Online (Sandbox Code Playgroud)

我们想要相应的空间

0*****
01***
012*
Run Code Online (Sandbox Code Playgroud)