题目
思路
感觉理解题意即可
- 对num每次模10取余,若余数n为4或9时单独处理
- 若余数n小于4则,按规定输出n个该位表示1的那个字符(比如个位,则输出n个I,十位,输出n个X)
- 若余数n大于4小于9,则先输出n-5个该位表示1的那个字符,再输出该位表示5的那个字符
- 注:都是反过来的,因为是直接压入字符串的,最后再颠倒过来,所以都是反过来的
代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string intToRoman(int num) {
string ret="";
int cnt=0;//用来标记当前循环的次数 =》cnt=0个位、cnt=1十位...
while (num) {
int n=num%10;
if(cnt==0){//当前是个位
if(n==4){
ret.push_back('V');
ret.push_back('I');
}
else if(n==9){
ret.push_back('X');
ret.push_back('I');
}
else if(n<4) {
for(int i=0;i<n;i++)
ret.push_back('I');
} else {
for(int i=5;i<n;i++)
ret.push_back('I');
ret.push_back('V');
}
} else if(cnt==1) {
if(n==4){
ret.push_back('L');
ret.push_back('X');
}
else if(n==9) {
ret.push_back('C');
ret.push_back('X');
}
else if(n<4) {
for(int i=0;i<n;i++)
ret.push_back('X');
} else {
for(int i=5;i<n;i++)
ret.push_back('X');
ret.push_back('L');
}
} else if(cnt==2){
if(n==4){
ret.push_back('D');
ret.push_back('C');
}
else if(n==9){
ret.push_back('M');
ret.push_back('C');
}
else if(n<4) {
for(int i=0;i<n;i++)
ret.push_back('C');
} else {
for(int i=5;i<n;i++)
ret.push_back('C');
ret.push_back('D');
}
} else {
for(int i=0;i<n;i++)
ret.push_back('M');
}
num/=10;
cnt++;
}
reverse(ret.begin(),ret.end());
return ret;
}
int main(){
int num;
cin>>num;
string str=intToRoman(num);
cout<<str<<endl;
return 0;
}