USACO 2.2 Preface Numbering(preface)

        将罗马数字的基础数值保存下来,基础数值包括题目中给出的7个以及它们之间符合规定的相减形式,全部的基础罗马数值string s[15]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}。而后对每个阿拉伯数字用贪心策略转换成罗马数字,保存为string类型,统计string中每一个字符出现的次数。而后打印出现次数非零的字符及出现次数便可。ios

 

/*
ID:jzzlee1
PROG:preface
LANG:C++
Dear double_tings:
i love you.
*/
#include<iostream>
#include<fstream>
#include<cmath>
#include<string>
#include<cstring>
#include<map>
using namespace std;
ifstream fin("preface.in");
ofstream fout("preface.out");
string s[15]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};//保存基础罗马数值
int	   a[15]={1000,900,500,400, 100, 90, 50,  40, 10,   9,  5,  4,   1 };//对应的阿拉伯数字
int ans[10]={0};//记录结果出现的次数
char ss[10]={'I','V','X','L','C','D','M'};
string change(int temp)					//将阿拉伯数字转换为罗马数字
{
	string str;int i,j=0;
	while(temp)
	{
		for(i=j;i<13;i++)
		{
			if(temp>=a[i])
			{
				temp-=a[i];
				str+=s[i];
				j=i;
				break;
			}
		}
	}
	return str;
}
void cal(string str)//统计每一个字符出现的次数
{
	string::size_type i=0;
	for(i=0;i!=str.size();++i)
	{
		switch(str[i])
		{
		case 'I':
			++ans[0];
			break;
		case 'V':
			++ans[1];
			break;
		case'X':
			++ans[2];
			break;
		case'L':
			++ans[3];
				break;
		case'C':
			++ans[4];
			break;
		case'D':
			++ans[5];
			break;
		case'M':
			++ans[6];
			break;
		}
	}
}
int main()
{
	int n;
	fin>>n;
	//cin>>n;
	int i;
	string str;
	for(i=1;i<=n;++i)
	{
		str+=change(i);//将全部罗马字符保存到一块儿
	}
	cal(str);
	for(i=0;i!=7;++i)
		if(ans[i])
			fout<<ss[i]<<" "<<ans[i]<<endl;
			//cout<<ss[i]<<" "<<ans[i]<<endl;
	return 0;
}
相关文章
相关标签/搜索