我有一些问题需要解决,我有点卡住了。 问题是编写一个程序,让用户输入一个奇数(检查它是奇数),然后根据输入的大小打印一个倒置的星形金字塔。
例如,如果输入5,则会出现
*****
***
*
因此我的问题是双重的。
1)我如何检查它是偶数还是奇数?我试过if number/2 == int
希望它可以做某事,而互联网告诉我做if number%2==0
,但这不起作用。
2)如何更改每行中间的星号?
非常感谢任何一个问题的帮助。
答案 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
,执行以下条件操作:
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 % 2
与n & 1
,而没有系统地检查其随n
的大小如何变化,证明可以预测速度。
简短的答案是,如果您使用大小合理的数字normally < 1e9,则不会有太大的区别。如果您使用较大的数字,则可能要使用按位运算符。
这里有一个图来演示正在发生的事情(在Linux 5.1.2下使用Python 3.7.3):
基本上,当您达到“任意精度”时,模数会逐渐变慢,而按位运算则保持不变。另外,请注意10**-7
乘数,即我每秒可以进行约3000万次(小整数)检查。
这与Python 2.7.16相同:
显示了更新版本的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)
将打印:
* * * * *
* * * *
* * *
* *
*