前言
这道题目,映入眼帘,瞬间懵了,根本不知道如何下手,也是查询了一下,明白了解题思路,其实一个数按照从左到右即百位、十位、个位的顺序打印对应的罗马数字,这里的罗马数字甚至可以看成字符,简言之,按顺序打印字符。
思考
首先,需要知道罗马数字,从1~100的写法,如下:
1-9:I、II、III、IV、V、VI、VII、VIII、IX
10-19:X、XI、XII、XIII、XIV、XV、XVI、XVII、XVIII、XIX
20-29:XX、XXI、XXII、XXIII、XXIV、XXV、XXVI、XXVII、XXVIII、XXIX
30-39:XXX、XXXI、XXXII、XXXIII、XXXIV、XXXV、XXXVI、XXXVII、XXXVIII、XXXIX
40-49:XL、XLI、XLII、XLIII、XLIV、XLV、XLVI、XLVII、XLVIII、XLIX
50-59:L、LI、LII、LIII、LIV、LV、LVI、LVII、LVIII、LIX
60-69:LX、LXI、LXII、LXIII、LXIV、LXV、LXVI、LXVII、LXVIII、LXIX
70-79:LXX、LXXI、LXXII、LXXIII、LXXIV、LXXV、LXXVI、LXXVII、LXXVIII、LXXIX
80-89:LXXX、LXXXI、LXXXII、LXXXIII、LXXXIV、LXXXV、LXXXVI、LXXXVII、LXXXVIII、LXXXIX
90-99:XC、XCI、XCII、XCIII、XCIV、XCV、XCVI、XCVII、XCVIII、XCIX
100:C
通过上述观察,可以发现:
1.第1-9位,是九个不同的罗马数字。
2.之后的整数十位,都会重新定义一个新的罗马数字,后面个位依次跟上从1-9位的罗马数字。
综上所述,程序设计的思路为:第1-9位,需要单独使用if语句进行判断,每次遇到整数十位,就先打印该十位对应的罗马数字。
解决
有了上述的程序设计思路,还需要对其进行细化一下:因为程序是自上而下运行的,如果先写if语句判断1-9位的罗马数字,再写每次遇到整数十位的代码,这样在for循环语句中,就无法循环使用1-9位的if判断。
语言叙述起来,可能会有些不好理解,直接上代码,以最直观的方式:
#include <stdio.h>
int main(void)
{
int x;
for (int i = 1; i <=100; i++)
{
x = i;
if (i == 100)
{
printf("%s", "C");
}
if (i >= 90 && i < 100)
{
printf("%s", "XC");
i -= 90;
}
if (i >= 80 && i < 90)
{
printf("%s", "LXXX");
i -= 80;
}
if (i >= 70 && i < 80)
{
printf("%s", "LXX");
i -= 70;
}
if (i >= 60 && i < 70)
{
printf("%s", "LX");
i -= 60;
}
if (i >= 50 && i < 60)
{
printf("%s", "L");
i -= 50;
}
if (i >= 40 && i < 50)
{
printf("%s", "XL");
i -= 40;
}
if (i >= 30 && i < 40)
{
printf("%s", "XXX");
i -= 30;
}
if (i >= 20 && i < 30)
{
printf("%s", "XX");
i -= 20;
}
if (i >= 10 && i < 20)
{
printf("%s", "X");
i -= 10;
}
if (i == 9)
{
printf("%s", "IX");
}
if (i == 8)
{
printf("%s", "VIII");
}
if (i == 7)
{
printf("%s", "VII");
}
if (i == 6)
{
printf("%s", "VI");
}
if (i == 5)
{
printf("%s", "V");
}
if (i == 4)
{
printf("%s", "IV");
}
if (i == 3)
{
printf("%s", "III");
}
if (i == 2)
{
printf("%s", "II");
}
if (i == 1)
{
printf("%s", "I");
}
i = x;
puts("");
}
}
代码本身,就是最好的解释。这里,单独对变量“x”的用处,简单加以说明。因为,不能在循环内修改for语句头里的变量值。所以,声明一个变量保存一下变量“i”。然后,对i进行修改后,重新把“x”的值赋给“i”。接着,可以继续正常进行下一次循环。
代码写完后,运行进行验证正确与否,结果如下:
结果与上述列出的罗马数字一致,通过。
也许你会觉得这种写法真的太麻烦了,确实如此,可是,结合前面四章所学习的知识,以这种方式求解该题,也多少感觉到作者对本书学习顺序的安排,正式这样麻烦的解题方式,是时候引出下一章即第五章的主题函数了。
当然,这仅是我个人的一种解题方法,绝不是唯一解,更不是最优解。还是老话常谈,一方面做记录,一方面希望可以帮到有需要的同学。