码迷,mamicode.com
首页 > 其他好文 > 详细

[找规律][模拟]罗马数字

时间:2017-06-07 12:40:35      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:模拟题   printf   lap   [1]   pen   cli   lin   while   get   

贴一个洛谷的链接吧。  

tvvj题号是1070

思考

1 A 2 AA 3 AAA 4 AB 5 B 6 BA 7 BAA 8 BAAA 9 AC 无论个位十位百位千位 上面的数字总是会出现这样的规律

那么这道题就是暴力模拟题目~

举个例子

255 CC L V

268 CC LX VIII

278 CC LXX VIII

289 CC LXXX IX

299 CC XC IX

发现了规律了没有?

9是一类 4是一类 5-8一类 1-3一类 那么思路就出现了

先判断个位上面的数 如果是九 那么一定是IX 这时有个问题就是不能直接 ans[1]++ ans[3]++ 因为十位上的9就是XC了

所以要加个 t 作为标志值 判断是在个位(t=1)还是十位(t=2)还是百位(t=3)还是千位(t=4)(暂时看不懂继续往下看)

先讨论下 (假设数组大小为7 当然你可以100 200)

5的情况: 个位是5 那么一定是V

十位是5 那么一定是L

百位是5 那么一定是D

在没有千位是5的情况下,V L D 只会在是5的情况出现 其余都不可能(多写几个数字去看)

所以 个位的5 就是 num[1] 十位的5就是num[2] 百位的5就是num[3] 即num[t] 当然你也可以写num[t+100] num[t+200] 只要没有矛盾情况随便写

9的情况: 个位是9 那么一定是IX

十位是9 那么是 XC

百位是9 那么是 CM

这里只剩下 4 5 6 7可以取 这里为了方便 因为 IX XC CM 是相邻的两个数 所以 num[t+3] num[t+4]

这里看一下 因为个位9 囊括了 I 所以I就是num[t+3] t=1 I就是num[4]

当然你也可以num[t+6] num[t+7] 这些都无所谓 只要不与前面的num矛盾随便你怎么取

4的情况: 个位4 IV

十位4 XL

百位4 CD

因为 4的情况就是 5-1 50-10 500-100

5 50 500 已经确定 1 10 100也已经确定填上就OK了

其余的 1 2 3 6 7 8 这些情况

直接 num[t+3]+= 情况

比如 个位的3 III num[4]+=3 十位的三 XXX num[5]+=3 百位的三 CCC num[6]+=3 千位的三 MMM num[7]+=3

 

技术分享
#include <cstdio>
using namespace std;
int ans[233];
inline void Run(int x){
    int t = 0 ;
    while(x){
        t++;
        int cur = x % 10;
        if(cur==9){
            ans[t+4]++;
            ans[t+3]++;
        }
        else{
            if(cur >= 5){
                ans[t]++;   
                cur-=5;
            }
            if(cur == 4){
                ans[t]++;
                ans[t+3]++;
            }
            else{
                ans[t+3]+=cur;
            }
        }
        x/=10;
    }
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++) Run(i);
    if(ans[4]) printf("I %d\n",ans[4]);
    if(ans[1]) printf("V %d\n",ans[1]);
    if(ans[5]) printf("X %d\n",ans[5]);
    if(ans[2]) printf("L %d\n",ans[2]);
    if(ans[6]) printf("C %d\n",ans[6]);
    if(ans[3]) printf("D %d\n",ans[3]);
    if(ans[7]) printf("M %d\n",ans[7]);
}
代码实现

 

[找规律][模拟]罗马数字

标签:模拟题   printf   lap   [1]   pen   cli   lin   while   get   

原文地址:http://www.cnblogs.com/OIerLYF/p/6955924.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!