解题思路:
注意事项:
参考代码:
脑力运动:
暴力枚举,模拟= =(貌似没什么好说的) 说一下对于每个数字计算罗马字母的个数的过程吧。可以手推下,其实也很简单。 我是把数一位一位模过去判断的。 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 人评分