计蒜客罗马数字与整数的相互转化(通俗易懂的暴力C++)

基本字符
I
V
X
L
C
D
M
相应的阿拉伯数字表示为
1
5
10
50
100
500
1000
  1. 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
  2. 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
  3. 小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
  4. 正常使用时、连写的数字重复不得超过三次;
  5. 在一个数的上面画一条横线、表示这个数扩大 1000 倍。

罗马数字规定是0到3999,想一下数据不是很多,看到CSDN很多大牛用map映射或者用字符数组存储来做,其实4000个数据不算多,我们不妨试一试用暴力来求解一下,所谓暴力就是最笨的一种方法,它就是从头到尾的找,找到满足条件的就输出,思想很简单代码也很容易看懂,比如C++中我们定义一个字符串函数那么返回就是一个字符串,类似string ......(int n){return 字符串}

类似这样的函数模型,在主函数输入一个需要转化的整数,再调用该字符串类型函数即可得到结果。对于字符串函数内部怎样写?

我们只需要求得传入的整数每一位的值在对应将字符串相加,首先我们需要定义一个空串string str = ""; 

那么if(n/1000==1)  s=s+"M"说明传入的整数有有一个千位那么字符串就会加上M,这样的定义空串在尾部加上新字符串不能用在C语言,因为这是C++STL的类库中string类库所有的。

那么我们怎样通过输入一个罗马数字转化为整数呢?

我们可以定义一个int类型函数,参数是字符串类型

这一个的话我们也是可以通过暴力搜索

比如我们输入一个字符串,调用转化函数,然后通过string.length()这个方法判断输入进去的字符串长度,通过一个循环我们遍历数组,假设if( 数组元素=='I')那么n+=1以此类推,但是有一个需要注意的点当我们输入类似IV,IX,XL,XC,CD,CM这些特殊的罗马数字时候,它还是默认相加而不是相减所以我们还需要对字符串进行一次扫描,调用C++string类库中的find(string)函数,这个函数的意思是在一个字符串中找到与括号相匹配的字符串,返回其下标再按刚刚说的,如果是IV正确的是4,但是没判断之前则是6,那么我们可以-2,其他情况也是类似。

附上源代码:

#include<iostream>
#include<string>
using namespace std;
//整数转罗马数字 
string InttoRoman(int n)
{
string s="";
int qianwei,baiwei,shiwei,gewei;
qianwei = n/1000;
baiwei = n/100%10;
shiwei = n/10%10;
gewei = n%10;
if(qianwei>0)
{
if(qianwei == 1)s+="M";
if(qianwei == 2)s+="MM";
if(qianwei == 3)s+="MMM";
    }
    if(baiwei>0)
    {
if(baiwei == 1)s+="C";
if(baiwei == 2)s+="CC";
if(baiwei == 3)s+="CCC";
if(baiwei == 4)s+="CD";
if(baiwei == 5)s+="D";
if(baiwei == 6)s+="DC";
if(baiwei == 7)s+="DCC";
if(baiwei == 8)s+="DCCC";
if(baiwei == 9)s+="CM";
    }
    if(shiwei>0)
    {
if(shiwei == 1)s+="X";
if(shiwei == 2)s+="XX";
if(shiwei == 3)s+="XXX";
if(shiwei == 4)s+="XL";
if(shiwei == 5)s+="L";
if(shiwei == 6)s+="LX";
if(shiwei == 7)s+="LXX";
if(shiwei == 8)s+="LXXX";
if(shiwei == 9)s+="XC";
    }
    if(gewei>0)
    {
if(gewei == 1)s+="I";
if(gewei == 2)s+="II";
if(gewei == 3)s+="III";
if(gewei == 4)s+="IV";
if(gewei == 5)s+="V";
if(gewei == 6)s+="VI";
if(gewei == 7)s+="VII";
if(gewei == 8)s+="VIII";
if(gewei == 9)s+="IX";
    }
return s;

//罗马数字转换为数字
int RomantoInt(string str)
{
int n = 0;
for(int i=0;i<str.length();i++)
{
char c = str[i];
if(c == 'I') n+=1;  
if(c == 'V')n+=5;
if(c == 'X') n+=10;
if(c == 'L') n+=50;
if(c == 'C') n+=100;
if(c == 'D') n+=500;
if(c == 'M') n+=1000;
}
int a = str.find("IV");   //从字符串找到IV后返回的下标 
int b = str.find("IX");   //从字符串找到IX后返回的下标
int c = str.find("XL");   //从字符串找到Xl后返回的下标
int d = str.find("XC");   //从字符串找到XC后返回的下标
int e = str.find("CD");   //从字符串找到CD后返回的下标
int f = str.find("CM");   //从字符串找到CM后返回的下标

if(a>=0) n-=2;        
if(b>=0) n-=2;
if(c>=0) n-=20;
if(d>=0) n-=20;
if(e>=0) n-=200;
if(f>=0) n-=200;

return n;




int main()
{
int num;
cin>>num;
    cout<<InttoRoman(num)<<endl;
    string s;
cin>>s;
    cout<<RomantoInt(s)<<endl;
return 0;
}


猜你喜欢

转载自blog.csdn.net/lytwy123/article/details/80808838