66

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

例如,如果你输入 5,它会出现

*****
 ***
  *

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

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

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

非常感谢您对这两个问题的任何帮助。

4

18 回答 18

95

给你完整的答案根本没有意义,因为这是家庭作业,所以这里有几点建议:

偶数或奇数

number % 2 == 0

绝对是一个很好的方法来确定你的号码是否是偶数。

如果您不知道%,这会取模,这里是除法的余number2http://en.wikipedia.org/wiki/Modulo_operation

打印金字塔

第一个建议:为了打印*****,你可以这样做print "*" * 5

第二个建议:为了使星号居中,您需要找出在星号之前要写多少空格。然后你可以打印一堆空格和星号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 % 2vs n & 1,而没有系统地检查它如何随 的大小而变化n,结果证明这是对速度的预测。

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

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

python3.7 基准测试

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

这是 Python 2.7.16 的相同图:

python2.7基准测试

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

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

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

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

于 2019-05-21T14:07:12.230 回答
9

简单但快速:

>>> 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)
于 2016-03-24T22:48:52.023 回答
6

1)我如何检查它是偶数还是奇数?我尝试了“if number/2 == int”,希望它能做点什么,互联网告诉我做“if number%2==0”,但这不起作用。

def isEven(number):
        return number % 2 == 0
于 2012-11-29T23:31:01.700 回答
6
if number%2==0

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

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

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

我们要相应地间隔

0*****
01***
012*
于 2012-11-29T23:32:29.467 回答
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

有很多方法可以检查 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)

希望能帮助到你

于 2015-06-07T13:52:06.080 回答
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')

等等...

于 2018-01-23T05:45:53.253 回答
1

这是我的解决方案:

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

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

  • 如果 n 是奇数,打印 Weird
  • 如果 n 是偶数并且在 2 到 5 的范围内,则打印 Not Weird
  • 如果 n 是偶数并且在 6 到 20 的范围内,则打印 Weird
  • 如果 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")
于 2017-11-14T17:13:37.490 回答
1
def main():
    n = float(input('odd:'))
    while n % 2 == 0:
        #if n % 2 == 1: No need for these lines as if it were true the while loop would not have been entered.
            #break not required as the while condition will break loop
        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

于 2017-11-13T17:30:34.633 回答
1

模数法是常用的方法。我们也可以这样做来检查奇数还是偶数:

def f(a):
    if (a//2)*2 == a:
        return 'even'
    else:
        return 'odd'

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

于 2020-05-11T12:13:53.230 回答
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

于 2019-07-04T13:37:14.363 回答
0

1.另一个奇怪的测试功能

好的,作业是在 8 多年前提交的,但这里有另一种基于位移操作的解决方案:

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

测试给出:

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

2.最近奇数替代方法

然而,与其说“给我这个精确的输入(一个整数奇数)否则我不会做任何事情”的代码,我还喜欢说“给我一个数字,任何数字,我会给你最接近那个数字的金字塔”。

在这种情况下,此功能很有帮助,并为您提供最接近的奇数(例如,将 6<=f<8 设置为 7 的任何数字 f 等等。)

def nearodd(f):
    return int(f/2)*2+1

示例输出:

nearodd(4.9)
5

nearodd(7.2)
7

nearodd(8)
9  
于 2020-12-05T21:19:13.663 回答
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)会打印:

 * * * * *
  * * * *
   * * *
    * *
     *
于 2021-04-19T06:09:47.307 回答