我有几个问题要解决,而且有点卡住了。问题是编写一个程序,让用户输入一个奇数(检查它是否是奇数),然后根据输入的大小打印一个倒置的星形金字塔。
例如,如果你输入 5,它会出现
*****
***
*
因此,我的问题是双重的。
1)我如何检查它是偶数还是奇数?我试图if number/2 == int
希望它可以做点什么,互联网告诉我做if number%2==0
,但这不起作用。
2)如何更改每行中间的星号?
非常感谢您对这两个问题的任何帮助。
给你完整的答案根本没有意义,因为这是家庭作业,所以这里有几点建议:
偶数或奇数:
number % 2 == 0
绝对是一个很好的方法来确定你的号码是否是偶数。
如果您不知道%
,这会取模,这里是除法的余number
数2
。http://en.wikipedia.org/wiki/Modulo_operation
打印金字塔:
第一个建议:为了打印*****
,你可以这样做print "*" * 5
。
第二个建议:为了使星号居中,您需要找出在星号之前要写多少空格。然后你可以打印一堆空格和星号print " "*1 + "*"*3
具有 %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
这里的一些解决方案引用了各种“偶数”操作所花费的时间,特别是n % 2
vs n & 1
,而没有系统地检查它如何随 的大小而变化n
,结果证明这是对速度的预测。
简短的回答是,如果您使用大小合理的数字,通常 < 1e9,它并没有太大的区别。如果您使用更大的数字,那么您可能希望使用按位运算符。
这是一个演示发生了什么的图(使用 Python 3.7.3,在 Linux 5.1.2 下):
基本上,当您达到“任意精度”时,模数会逐渐变慢,而按位运算则保持不变。另外,请注意10**-7
乘数,即我每秒可以进行约 3000 万(小整数)检查。
这是 Python 2.7.16 的相同图:
它显示了新版本 Python 中的优化。
我的机器上只有这些版本的 Python,但可以重新运行其他感兴趣的版本。在 1 和 1e100 之间有 51n
秒(在对数刻度上均匀分布),对于每个点我都相当于:
timeit('n % 2', f'n={n}', number=niter)
其中niter
计算为timeit
花费约 0.1 秒,并且重复 5 次。稍微尴尬的处理n
是确保我们没有对全局变量查找进行基准测试,这比局部变量慢。这些值的平均值用于绘制线,而各个值则绘制为点。
简单但快速:
>>> 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)
1)我如何检查它是偶数还是奇数?我尝试了“if number/2 == int”,希望它能做点什么,互联网告诉我做“if number%2==0”,但这不起作用。
def isEven(number):
return number % 2 == 0
if number%2==0
会告诉你它是均匀的。所以奇数将是那里的 else 语句。"%" 是除法后返回余数的 mod 符号。所以本质上我们说如果这个数字可以被 2 整除,我们可以安全地假设它是偶数。否则很奇怪(这是一个完美的相关性!)
至于星号放置,您希望在星号之前加上与其所在行相关的空格数。在你的例子中
***** line 0
*** line 1
* line 2
我们要相应地间隔
0*****
01***
012*
我想最简单和最基本的方法是这个
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')
只是基本条件和数学。它也注意零,它既不是偶数也不是奇数,你可以通过输入给出你想要的任何数字,所以它非常可变。
la = lambda x : "even" if not x % 2 else "odd"
关于打印输出,以下是我使用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 )
有很多方法可以检查 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)
希望能帮助到你
这是简单的代码。您可以尝试并轻松掌握知识。
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')
等等...
这是我的解决方案:
def is_even(n):
r=n/2.0
return True if r==int(r) else False
示例指令
给定一个整数,n
执行以下条件操作:
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")
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
模数法是常用的方法。我们也可以这样做来检查奇数还是偶数:
def f(a):
if (a//2)*2 == a:
return 'even'
else:
return 'odd'
整数除以 2,然后乘以 2。
我的解决方案基本上我们有两个字符串,使用 & 我们得到正确的索引:
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
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
这个功能
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)
会打印:
* * * * *
* * * *
* * *
* *
*