【问题标题】:Representing Year as Roman Number [duplicate]用罗马数字表示年份 [重复]
【发布时间】:2011-06-29 06:03:26
【问题描述】:

可能重复:
How to convert integer value to Roman numeral string?

在我大学时代,当我学习 C 和 all 时,我遇到了一个问题,即用相应的罗马数字形式表示一年。该案文中没有解决方案,因为这是一些需要思考的额外问题。我能想到的只是使用模数运算符和一堆ifs。我想知道是否有人可以给我一个合适的解决方案。一个简单的算法或所用逻辑的解释将不胜感激。

【问题讨论】:

  • 我不想要上面链接中指定的代码,我想要一个简单的逻辑解释。
  • 从代码中可以看出逻辑。那里只有几行到几行代码。另外,答案和 cmets 中对此进行了解释。有什么不明白的地方欢迎追问。

标签: c algorithm roman-numerals


【解决方案1】:

以下是小于 4,000 的数字的逻辑。 (有关在此之上做什么,请参见下文。)有一个基本的 4 步算法适用于每个幅度级别。

  1. 确定数字中的千位数:floor(number/1000)。输出那么多“M”并从数字中减去几千。此时,人数不足一千。

  2. 如果数字 >= 900,则输出“CM”并减去 900。

  3. 如果数字 >= 500,则输出“D”并减去 500。

  4. 如果数字 >= 400,则输出“CD”并减去 400。

此时,保证数量

  1. 确定数字中的百位数,输出那么多“C”并从数字中减去那么多百。此时,人数不足100。

  2. 如果数字 >= 90,则输出“XC”并减去 900。

  3. 如果数字 >= 50,则输出“L”并减去 50。

  4. 如果数字 >= 40,则输出“XL”并减去 40。

此时,数字保证小于 40。我们使用“X”、“IX”、“V”和“IV”重复完全相同的逻辑。最后,我们使用数字(保证小于 4)作为要输出多少个“I”的计数。

对于较大的数字,逻辑仍然相同,我们只是使用顶部带有条形的标准符号。每个条表示没有该条的值的 1,000 倍。 (所以带条的 V 是 5,000 等)

【讨论】:

  • 似乎在这里使用递归会更容易实现,对吧?
  • 是的,这里有某种无意识的重复,让人想起递归:)。递归的簿记可能与展开逻辑一样多,至少对于罗马数字旨在处理的范围内的数字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多