罗马数字!!!
将1~n转成罗马数字后,求出现过的罗马字母各出现几次。
一直不想学罗马数字,觉得好复杂。大概看了下题目,知道要转罗马数字,就打开了bdbk。https://baike.baidu.com/item/%E7%BD%97%E9%A9%AC%E6%95%B0%E5%AD%97/772296?fr=aladdin
罗马数字看起来规则有点多,看完觉得其实还好。
觉得减法不好处理,就打了个减法的表。然后就暴力求吧。
这题还是比较水的,一遍过。
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int x=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x;
}
map<int,string> m;
int b[14],tot,a[10];
char s[10];
inline void roman(int x){
string str="";
while(x>0){
int i=13;
while(b[i]>x) --i;
x-=b[i];
str+=m[b[i]];
}
int l=str.length();
for(int i=0;i<l;++i){
char c=str[i];
bool f=1;
for(int j=1;j<=tot;++j)
if(s[j]==c){
f=0;++a[j];
break;
}
if(f) s[++tot]=c,a[tot]=1;
}
}
int main()
{
freopen("preface.in","r",stdin);
freopen("preface.out","w",stdout);
int n=read();
m[1]="I";b[1]=1;
m[4]="IV";b[2]=4;
m[5]="V";b[3]=5;
m[9]="IX";b[4]=9;
m[10]="X";b[5]=10;
m[40]="XL";b[6]=40;
m[50]="L";b[7]=50;
m[90]="XC";b[8]=90;
m[100]="C";b[9]=100;
m[400]="CD";b[10]=400;
m[500]="D";b[11]=500;
m[900]="CM";b[12]=900;
m[1000]="M";b[13]=1000;
for(int i=1;i<=n;++i) roman(i);
for(int i=1;i<=tot;++i) printf("%c %d\n",s[i],a[i]);
}