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

时间:2012-11-29 23:24:38

标签: python numbers

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

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

*****
 ***
  *

因此我的问题是双重的。

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

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

非常感谢任何一个问题的帮助。

18 个答案:

答案 0 :(得分:85)

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

偶数或奇数

number % 2 == 0

绝对是一个非常好的方法来查找您的号码是否均匀。

如果你不知道%,这就是模数,这是number 2除以*****的余数。 http://en.wikipedia.org/wiki/Modulo_operation

打印金字塔

第一条建议:要打印print "*" * 5,您可以执行print " "*1 + "*"*3

第二条建议:为了使星号居中,您需要找出在星号之前要写入多少空格。然后,您可以使用{{1}}

打印一堆空格和星号

答案 1 :(得分:24)

%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

答案 2 :(得分:8)

简单但又快速:

>>> def is_odd(a):
...     return bool(a - ((a>>1)<<1))
...
>>> print(is_odd(13))
True
>>> print(is_odd(12))
False
>>>

甚至更简单:

>>> def is_odd(a):
...   return bool(a & 1)

答案 3 :(得分:5)

if number%2==0

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

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

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

我们想要相应的空间

0*****
01***
012*

答案 4 :(得分:5)

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

def isEven(number):
        return number % 2 == 0

答案 5 :(得分:3)

la = lambda x : "even" if not x % 2 else "odd"

答案 6 :(得分:2)

我想最简单,最基本的方法就是这个

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')

基本条件和数学。它也会注意零,这既不是偶数也不是奇数,你可以通过输入给出你想要的任何数字,所以它变化很大。

答案 7 :(得分:1)

有很多方法可以检查int值是奇数还是偶数。 我将向您展示两种主要方式:

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)

希望有所帮助

答案 8 :(得分:1)

这是我的解决方案:

def is_even(n):
    r=n/2.0
    return True if r==int(r) else False

答案 9 :(得分: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 )

答案 10 :(得分:1)

示例说明 给定一个整数n,执行以下条件操作:

  • 如果n为奇数,则打印Weird
  • 如果n是偶数且在2到5的包含范围内,则打印Not Weird
  • 如果n是偶数且在6到20的包含范围内,则打印奇怪
  • 如果n是偶数且大于20,则打印Not Weird
import math
n = int(input())

if n % 2 ==1:
    print("Weird")
elif n % 2==0 and n in range(2,6):
    print("Not Weird")
elif n % 2 == 0 and n in range(6,21):
    print("Weird")
elif n % 2==0 and n>20:
    print("Not Weird")

答案 11 :(得分:1)

这是一个简单的代码。您可以尝试并轻松获取知识。

n = int(input('Enter integer : '))
    if n % 2 == 3`8huhubuiiujji`:
        print('digit entered is ODD')
    elif n % 2 == 0 and 2 < n < 5:
        print('EVEN AND in between [2,5]')
    elif n % 2 == 0 and 6 < n < 20:
        print('EVEN and in between [6,20]')
    elif n % 2 == 0 and n > 20:
       print('Even and greater than 20')

依旧......

答案 12 :(得分:1)

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

简短的答案是,如果您使用大小合理的数字normally < 1e9,则不会有太大的区别。如果您使用较大的数字,则可能要使用按位运算符。

这里有一个图来演示正在发生的事情(在Linux 5.1.2下使用Python 3.7.3):

python3.7 benchmark

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

这与Python 2.7.16相同:

python2.7 benchmark

显示了更新版本的Python中进行的优化。

我的机器上只有这些版本的Python,但是可以重新运行其他感兴趣的版本。在1和1e100之间有51个n(均匀分布在对数刻度上),对于每个点,我都执行以下操作:

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

其中niter被计算为使timeit花费〜0.1秒,并且重复了5次。 n的处理有点尴尬,是为了确保我们也没有对全局变量查找进行基准测试,该查询比局部变量慢。这些值的平均值用于绘制线,而各个值则作为点绘制。

答案 13 :(得分:1)

模量法是常用方法。我们还可以执行以下操作检查奇数或偶数:

wget https://downloads.mongodb.com/compass/mongodb-compass_1.21.1_amd64.deb
sudo dpkg -i mongodb-compass_1.21.1_amd64.deb
sudo apt --fix-broken install
mongodb-compass

整数除以2,然后乘以2。

答案 14 :(得分:0)

def main():
    n = float(input('odd:'))
    while n % 2 == 0:
        if n % 2 == 1:
            break
        n = float(input('odd:'))


    for i in range(int((n+1)/2)):
        print(' '*i+'*'*int((n-2*i))+' '*i)

main()

#1st part ensures that it is an odd number that was entered.2nd part does the printing of triangular

答案 15 :(得分:0)

我的解决方案基本上有两个字符串,使用&可以得到正确的索引:

res = ["Even", "Odd"]
print(res[x & 1])

请注意,它似乎比其他方法要慢:

#!/usr/bin/env python3
import math
import random
from timeit import timeit

res = ["Even", "Odd"]

def foo(x):
    return res[x & 1]

def bar(x):
    if x & 1:
        return "Odd"
    return "Even"

la = lambda x : "Even" if not x % 2 else "Odd"

iter = 10000000

time = timeit('bar(random.randint(1, 1000))', "from __main__ import bar, random", number=iter)
print(time)
time = timeit('la(random.randint(1, 1000))', "from __main__ import la, random", number=iter)
print(time)
time = timeit('foo(random.randint(1, 1000))', "from __main__ import foo, random", number=iter)
print(time)

输出:
8.05739480999182
8.170479692984372
8.892275177990086

答案 16 :(得分:0)

另一种基于移位操作的解决方案。

def isodd(i):
    return(bool(i>>0&1))

测试给出:

>>> isodd(2)
False
>>> isodd(3)
True
>>> isodd(4)
False

答案 17 :(得分:0)

这个函数

def oddOrEven(num):
    if num%2 == 0:
        print("even")

    else: 
        for i in range(num):
            for j in range(i+1):
                print(" ", end="")
            for m in range(num-i, 0, -1):
                print("* ", end="")
            print()

但是有一个问题,因为返回一个模式几乎是不可能的,所以我们必须打印而不是返回它然后直接使用它oddOrEven(5)将打印:

 * * * * *
  * * * *
   * * *
    * *
     *