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;
}
相關文章
相關標籤/搜索