罗马数字与整数的相互转化(通俗易懂的暴力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
#include
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=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<>s;
    cout<


你可能感兴趣的:(C++)