《C语言大学教程(第八版)》第四章 课后习题 4.33 参考答案

前言
  这道题目,映入眼帘,瞬间懵了,根本不知道如何下手,也是查询了一下,明白了解题思路,其实一个数按照从左到右即百位、十位、个位的顺序打印对应的罗马数字,这里的罗马数字甚至可以看成字符,简言之,按顺序打印字符。
思考
  首先,需要知道罗马数字,从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”。接着,可以继续正常进行下一次循环。
  代码写完后,运行进行验证正确与否,结果如下:
在这里插入图片描述
在这里插入图片描述
  结果与上述列出的罗马数字一致,通过。
  也许你会觉得这种写法真的太麻烦了,确实如此,可是,结合前面四章所学习的知识,以这种方式求解该题,也多少感觉到作者对本书学习顺序的安排,正式这样麻烦的解题方式,是时候引出下一章即第五章的主题函数了。
  当然,这仅是我个人的一种解题方法,绝不是唯一解,更不是最优解。还是老话常谈,一方面做记录,一方面希望可以帮到有需要的同学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值