原题链接:序言页码
解题思路:
注意事项:
参考代码:
脑力运动:
暴力枚举,模拟= =(貌似没什么好说的) 说一下对于每个数字计算罗马字母的个数的过程吧。可以手推下,其实也很简单。 我是把数一位一位模过去判断的。 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; }
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复