def factors_to_three (n)
puts n
if n % 3 == 0
puts "Your number is divisible by 3"
else
puts "Your Number is NOT divisible by 3"
end
end
puts "Enter the number to check if its divisible by 3"
number = gets.chomp
factors_to_three(number)
无论我输入什么号码,我的节目总是会输出Your Number is NOT divisible by 3
,即使是明确的。
答案 0 :(得分:3)
n
不是整数。 gets()
返回一个字符串,chomp
删除换行符,但数据仍然是一个字符串。
"6" % 3 != 0
6 % 3 == 0
您需要将传入数据转换为整数表示。
答案 1 :(得分:2)
使用gets
读取文本时,会以字符串形式读入。因此,在您的代码中,number
实际上不是数字,而是字符串。因此,"模数"运算符实际上不是模数运算符,而String
上的格式运算符String#%
:
格式 - 使用str作为格式规范,并返回将其应用于arg的结果。如果 格式规范包含多个替换,然后是arg 必须是包含要替换的值的数组或哈希。看到 Kernel :: sprintf有关格式字符串的详细信息。
"%05d" % 123 #=> "00123" "%-5s: %08x" % [ "ID", self.object_id ] #=> "ID : 200e14d6" "foo = %{foo}" % { :foo => 'bar' } #=> "foo = bar"
如您所见,此方法返回一个不等于零的字符串。因此,该程序总是会说该数字不可被3整除,即使它是。
您可以通过在to_i
get
来解决此问题
number = gets.chomp.to_i
答案 2 :(得分:2)
您的结果将始终为false
,因为gets.chomp
会返回字符串:
number = gets.to_i
上面的代码可以使用,但您必须始终键入一个整数。有更好的方法来管理检查输入是否有效。
所以你可以先检查一下:
number = gets
factors_to_three(number.to_i) if number.is_a?(Integer)