我是初学者,并在ruby中为下面的问题编写了一个脚本。我读到重复不是推荐的,并希望减少if,elsif,else语句的重复,但似乎无法找到方法。
老派罗马数字。在罗马数字的早期,罗马人并没有打扰任何这种新奇的牵引“IX”废话。不,先生,它是直接添加,最大到最小 - 所以9写的是“VIIII”,依此类推。编写一个方法,当传递1到3000之间的整数(或左右)时,返回一个包含正确的老式罗马数字的字符串。换句话说,old_roman_numeral 4应返回' IIII'。确保在一堆不同的数字上测试你的方法。提示:使用第37页的整数除法和模数法。 作为参考,这些是使用的字母的值: I = 1V = 5X = 10L = 50℃= 100D = 500M = 1000
这是我的剧本......
puts "What is your number?"
n = gets.chomp
num = n.to_i
number = ""
l = n.length
i = 0
while true
if num > 3000
puts "Enter another number."
elsif l == 0
break
else
if l == 4
number += "M" * n[i].to_i
l -= 1
i += 1
elsif l == 3
if 1 <= n[i].to_i && n[i].to_i <= 4
number += "C" * n[i].to_i
elsif n[i].to_i == 5
number += "D"
elsif 6 <= n[i].to_i && n[i].to_i <= 9
number += "D" + "C" * (n[i].to_i - 5)
end
l -= 1
i += 1
elsif l == 2
if 1 <= n[i].to_i && n[i].to_i <= 4
number += "X" * n[i].to_i
elsif n[i].to_i == 5
number += "L"
elsif 6 <= n[i].to_i && n[i].to_i <= 9
number += "L" + "X" * (n[i].to_i - 5)
end
l -= 1
i += 1
else
if 1 <= n[i].to_i && n[i].to_i <= 4
number += "I" * n[i].to_i
elsif n[i].to_i == 5
number += "V"
elsif 6 <= n[i].to_i && n[i].to_i <= 9
number += "V" + "I" * (n[i].to_i - 5)
end
l -= 1
i += 1
end
end
end
答案 0 :(得分:1)
这不使用整数除法或模数,但它可能是有益的。
puts "What is your number?"
input = gets.to_i
numerals = {
1000 => "M",
500 => "D",
100 => "C",
50 => "L",
10 => "X",
5 => "V",
1 => "I"
}
digits = []
numerals.each do |n, digit|
while input >= n
digits << digit
input = input - n
end
end
puts digits.join
答案 1 :(得分:1)
另一种方法,就像@sawa建议的那样构建一个字符串,而不是构造一个数组然后使用join
:
numerals = {
1000 => "M",
500 => "D",
100 => "C",
50 => "L",
10 => "X",
5 => "V",
1 => "I"
}
input = 9658
numerals.each_with_object('') do |(n, digit),str|
nbr, input = input.divmod(n)
str << digit*nbr
end
#=> "MMMMMMMMMDCLVIII"