解题思路:





注意事项:





参考代码:

脑力运动:


暴力枚举,模拟= =(貌似没什么好说的)
说一下对于每个数字计算罗马字母的个数的过程吧。可以手推下,其实也很简单。
我是把数一位一位模过去判断的。
1.若数还大于1000就算一下相应的字母个数,然后数%1000。
2.若数还大于100就算一下相应的字母个数,然后数%100。
3.若数还大于10就算一下相应的字母个数,然后数%10。
4.若数还大于1就算一下相应的字母个数,然后没了。
算个数的过程还需仔细考虑一下下,就没啦~~
然后就枚举1~n累加一下就完成了。
代码:


#include<cstdio>
#include<cstring>
using namespace std;
const char c[7] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'};
int ans[7];void count(int k)   //模拟算转成罗马字母后的相应字母的增加个数
{    if (k / 1000 > 0)
{
        ans[6] += k / 1000;
        k %= 1000;
    }    if (k / 100 > 0)
    {        
    int t = k / 100;        
    if (t < 4) ans[4] += t;        
    if (t == 4) ans[5] ++, ans[4] ++;        
    if (t >= 5 && t < 9) ans[5] ++, ans[4] += t - 5;        
    if (t == 9) ans[4] ++, ans[6] ++;
        k %= 100;
    }    
    if (k / 10 > 0)
    {        
    int t = k / 10;     
       if (t < 4) ans[2] += t;   
       if (t == 4) ans[3] ++, ans[2] ++;     
       if (t >= 5 && t < 9) ans[3] ++, ans[2] += t - 5;        
       if (t == 9) ans[2] ++, ans[4] ++;
       k %= 10;
    }   
     if (k > 0)
     {        
     int t = k;       
     if (t < 4) ans[0] += t;        
     if (t == 4) ans[1] ++, ans[0] ++;        
     if (t >= 5 && t < 9) ans[1] ++, ans[0] += t - 5;        
     if (t == 9) ans[0] ++, ans[2] ++;
     }
}
     int main(){    
     int n;   
     scanf("%d", &n);   
     for (int i = 1; i <= n; i ++) count(i);   //枚举大法
     for (int i = 0; i < 7; i ++)        
     if (ans[i]) printf("%c %d\n", c[i], ans[i]);    return 0;
}


点赞(1)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论