首页 > 代码库 > [找规律][模拟]罗马数字

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

贴一个洛谷的链接吧。  

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]);}
代码实现

 

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