首页 > 代码库 > [找规律][模拟]罗马数字
[找规律][模拟]罗马数字
贴一个洛谷的链接吧。
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]);}
[找规律][模拟]罗马数字