A:罗马数字

字符串处理,没有什么特别的,本机不会测试文件输入输出流……难过

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int w[26];

void init()
{
	memset(w, 0, sizeof(int)*26);
	w['I'-'A']=1;
	w['V'-'A']=5;
	w['X'-'A']=10;
	w['L'-'A']=50;
	w['C'-'A']=100;
	w['D'-'A']=500;
	w['M'-'A']=1000;
}

int toint(string s)
{
	int i, n=0, tmp;
	for(i=0; i<s.length(); i++)
	{
		tmp = w[s[i]-'A'];
		if(i+1 < s.length() && w[s[i+1]-'A']>tmp)
		{
			tmp=w[s[i+1]-'A']-tmp;
			i++;
		}
		n+=tmp;
	}
	return n;
}

string toiii(int n)
{
	string s= "";
	char *iii="MDCLXVI";
	int i,unit=1000;

	while(n>=unit)
	{
		s+='M';
		n-=unit;
	}

	for(i=0, unit /=10; unit>0; unit /=10, i+=2)
	{
		if(i>=9*unit)
		{
			s+=iii[i+2];
			s+=iii[i];
			n-=9*unit;
		}
		else
		{
				if(n>=5*unit)
				{
					s+=iii[i+1];
					n-=5*unit;
				}
				else if(n>=4*unit)
				{
					s+=iii[i+2];
					s+=iii[i+1];
					n-=4*unit;
				}

				while(n>=unit)
				{
					s+=iii[i+2];
					n-=unit;
				}

		}
	}
	return s;
}

int main()
{
	//ifstream cin("roma.in");
	//ofstream cout("estdout.pc2");

	init();
	int n,num=0;

	while(cin >> n)
	{
		if(n==0) break;
		int s=0;
		string t;
		for(int i=0; i<n; i++)
		{
				cin >> t;
				s+=toint(t);
		}
		t=toiii(s);
		cout << t << endl;
	}
	return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
正则表达式可以用来剔除罗马数字。具体的方法可以使用正则表达式中的字符类来匹配罗马数字的模式,然后使用替换方法将这些罗马数字替换为空字符串。罗马数字的模式可以使用正则表达式中的元字符和限定符来定义。 一个简单的方法是使用字符类[IVXLCDM]来匹配罗马数字的单个字符。然后可以使用+限定符来匹配连续的多个罗马数字字符。例如,使用正则表达式/[IVXLCDM]+/可以匹配一个或多个罗马数字。 然后,可以使用替换方法将匹配到的罗马数字替换为空字符串。在JavaScript中,可以使用replace()函数来实现替换。例如,可以使用以下代码来剔除字符串中的罗马数字: ```javascript var str = "This is a string with some Roman numerals: II, V, X"; var result = str.replace(/[IVXLCDM]+/g, ""); ``` 上述代码会将字符串中的所有罗马数字替换为空字符串,得到结果:"This is a string with some Roman numerals: , , "。 需要注意的是,上述方法只能剔除连续的罗马数字字符,如果罗马数字之间有其他字符或空格,需要额外处理。可以使用正则表达式的边界匹配来确保只匹配完整的罗马数字单词。 请注意,这只是一种简单的方法,不适用于复杂的罗马数字匹配问题。对于更复杂的需求,可能需要使用更详细的正则表达式规则或其他方法来处理罗马数字的剔除。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值