我有一个简单的程序,我不明白是什么问题。
(1..100).each do|i|
if(i%3 == 0)
puts "Fizz"
elsif(i%5 == 0)
puts "Buzz"
elsif((i%5 == 0) && (i%3 == 0))
puts "FizzBuzz"
else
puts "#{i}"
end
end
除了5和3都能分割的数字外,一切正常。
当我运行程序时,我得到了
1,2,Fizz,4,Buzz,.......,14,Fizz,...
有什么问题?
答案 0 :(得分:1)
如果它可以被3和5整除,则较早的if
/ elsif
会捕获它。该行不应该是elsif
,应该是if
,或者您需要在各个部分之前对其进行测试。
基本上,逻辑流程不正确。
答案 1 :(得分:1)
每个可以用5和3整除的数字,请注意它们首先使条件if (i%3 == 0)
为真。因此永远不会输入elsif((i%5 == 0) && (i%3 == 0))
。
一个简单的解决方法是首先检查((i%5 == 0) && (i%3 == 0))
。
答案 2 :(得分:1)
您误解了一旦满足if
中的条件,就不会检查其余条件。
一种聪明的方法是在这种情况下使用mod 15,如:
(1..100).each do|i|
if(i%15 == 0)
puts "FizzBuzz"
elsif(i%3 == 0)
puts "Fizz"
elsif(i%5 == 0)
puts "Buzz"
else
puts "#{i}"
end
end
答案 3 :(得分:0)
有一种更直接的方法,无需检查所有情况。
创建一个数组并将结果字符串放在那里。
这是一个片段。
def fizzbuzz
(1..100).each do|i|
r = []
if(i % 3 == 0)
r << "Fizz"
end
if(i % 5 == 0)
r << "Buzz"
end
if r.empty?
r << i
end
puts r.join
end
end