原题链接:序言页码
解题思路:
注意事项:
参考代码:
脑力运动:
暴力枚举,模拟= =(貌似没什么好说的)
说一下对于每个数字计算罗马字母的个数的过程吧。可以手推下,其实也很简单。
我是把数一位一位模过去判断的。
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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复