@RiverHamster
2017-11-18T17:15:13.000000Z
字数 1359
阅读 3144
楼下的打表不太好理解,来一发好写又好理解的打表方法。
每一位之间没有关系,可以分别处理,直接把千位、百位、十位、个位按顺序放就可以。0直接跳过
例如:123:CXXIII
每一位上的数字的表示方法:
“表示方法”列中以个位为例,1=I,5=V,10=X,n表示这一位上的数字,十位百位以此类推。
类别 | 表示方法(以个位为例) | 示例1 | 示例2 |
---|---|---|---|
1~3 | n个I | 2=II | 30=LLL |
4 | IV | 4=IV | 400=CD |
5~8 | V和(n-5)个I | 5=V | 70=LXX |
9 | IX | 9=IX | 900=CM |
s[i][j]表示右数第i位(个位i=1)上的j的表示方法,注意数组赋初值的格式。
string s[5][11]={ //注意每一位上的0都给出空字符串,方便操作
{}, //空出第0行
{"","I","II","III","IV","V","VI","VII","VIII","IX"}, //个位
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"}, //十位
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"}, //百位
{"","M","MM","MMM"} //千位(打3个就可以满足题目要求)
};
对每一个数进行计数:(uint是unsigned int)
void Calc(int n){
int now=1; //当前的数位
while(n>0){
Count(s[now][n%10]); //将字符串计数
now++,n/=10; //下一位
}
}
#include <cstdio>
#include <string>
#include <iostream>
typedef unsigned int uint;
using namespace std;
string s[5][11]={
{},
{"","I","II","III","IV","V","VI","VII","VIII","IX"},
{"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"},
{"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"},
{"","M","MM","MMM"}
};
string ap="IVXLCDM"; //罗马数字列表,方便输出
int c[300]; //统计数组
void Count(string s){ //将字符串每一位统计
for(uint i=0;i<s.size();i++) c[(uint)s[i]]++;
}
void Calc(int n){
int now=1;
while(n>0){
Count(s[now][n%10]);
now++,n/=10;
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) Calc(i); //对每一个数字统计
for(uint i=0;i<ap.size();i++){ //按顺序输出
if(c[(uint)ap[i]]>0) //有这个字母
printf("%c %d\n",ap[i],c[(uint)ap[i]]);
}
return 0;
}
将鼠标放到这里,点击右边的按钮来批注