下面有这个算法问题,我可以在网上找到一个解决方案,看起来很像我想出的但是我无法理解3和5部分的倍数。
问题是"编写一个程序,输出从1到n的数字的字符串表示。但是对于三倍的倍数,它应输出“Fizz”而不是数字,并输出五个输出“Buzz”的倍数。对于三个和五个输出“FizzBuzz”的倍数的数字。"
这是谷歌的解决方案:
def fizzBuzz(n):
for i in range(1,n+1):
return ['Fizz' * (not i % 3) + 'Buzz' * (not i % 5) or str(i) for i in range(1, n+1)]
这就是我想为类似的问题做的事情:
def nicFizzbuzz(n):
for i in range(1,n+1):
#print(i)
if ( not i % 3):
print('Fizz')
elif(not i % 5):
print('Buzz')
elif(not i % 3) and (not i % 5):
print("FizzBuzz")
else:
print(i)
有人可以解释我哪里出错吗?
答案 0 :(得分:1)
你必须先写下3和5的案例。
def nicFizzbuzz(n):
for i in range(1,n+1):
#print(i)
if(not i % 3) and (not i % 5):
print("FizzBuzz")
elif ( not i % 3):
print('Fizz')
elif(not i % 5):
print('Buzz')
else:
print(i)
答案 1 :(得分:0)
您正在评估错误的条件。让我们假设n是从1到20.你希望看到“FizzBuzz”打印在15处。但是从你的函数中,你首先评估15可以被3整除,这是真的。该函数不评估其余条件并移至16。
一个简单的解决方法是将3和5的可分性条件移到顶部,如
def nicFizzbuzz(n):
for i in range(1,n+1):
if(not i % 3) and (not i % 5):
print("FizzBuzz")
elif ( not i % 3):
print('Fizz')
elif(not i % 5):
print('Buzz')
else:
print(i)
n = 20
nicFizzbuzz(n)
,这导致
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz
答案 2 :(得分:0)
将测试值移到3和5之上的值可以在其他测试之上移动,这是获得正确结果的好方法,但我想添加另一种方法来实现这一点。
而不是单独对每个组合进行测试,而是不。此版本不是使用elif
,而是累积要打印的值。
def nicFizzbuzz(n):
for i in range(1,n+1):
val = ''
if (not i % 3):
val += 'Fizz'
if (not i % 5):
val += 'Buzz'
print(val or i)