题目
思路
题目的“左减限制“和实际给的数据并不统一,给的数据里面只要左边的数字整体比下一个字符小就是-。。。这个考试的时候真的无语。。
总体来说这个题目得用栈的思想来进行解题。
首先是什么时候要×1000?自然是遇见左括号的时候,遇见右括号再/1000
然后把字符都转换好对应的数字,之后遍历所有的数字判定前一个数字是否比后一个数字小,之后累加即可。
代码
#include<iostream>
using namespace std;
int R[130];
int main()
{
R['I'] = 1, R['V'] = 5, R['X'] = 10, R['L'] = 50, R['C'] = 100, R['D'] = 500, R['M'] = 1000;
long long flag = 1;
long long sum = 0;
string s;
cin >> s;
int len = s.length();
//利用栈的特性来判定正负
long long* each = new long long[len];
int count = 0;
for(int i = 0; i < len; i++)
{
switch (s[i])
{
case '(':
flag *= 1000;
break;
case ')':
flag /= 1000;
break;
default:
each[count++] = flag * R[s[i]];
break;
}
}
for(int i = 0; i < count; i++)
{
if(i == count - 1)
sum += each[i];
else
sum += ((each[i] < each[i + 1]) ? -each[i] : each[i]);
}
cout << sum;
}