lalalala


私信TA

用户名:zhangshuo

访问量:161495

签 名:

像狗一样的学习,像绅士一样地玩耍。

等  级
排  名 7
经  验 31295
参赛次数 10
文章发表 201
年  龄 12
在职情况 学生
学  校 芜湖市第十一中学
专  业

  自我简介:

今日懒惰流下的口水,将会成为明日里伤心的泪水。

解题思路:





注意事项:





参考代码:

脑力运动:


暴力枚举,模拟= =(貌似没什么好说的)
说一下对于每个数字计算罗马字母的个数的过程吧。可以手推下,其实也很简单。
我是把数一位一位模过去判断的。
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 人评分

  评论区

  • «
  • »