题目描述:
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!702
程序分析:
这个题目的难点有两个:
1.需要将7个罗马字符与对应的10进制数字建立对应关系;
2.需要实现对罗马数字向10进制的转换。
解决方法分别是:
1.建立字符数组,然后按照顺序保存罗马数字,建立同样大小的int数组并按照顺序保存罗马数字对应的十进制;
则两个数组之间的关系是按照顺序一一对应,我们只需要对输入的每一个字符根据字符数组进行判断,然后保存它对应的序号,并根据序号调用罗马数字对应的十进制。
demo:
#include<iostream>
using namespace std;
void fun(int *a,int len)
{
int b[7]={1,5,10,50,100,500,1000};
for(int i=0;i<len;i++)
{
cout<<b[a[i]]<<" ";
}
cout<<endl;
}
int main()
{
char str[10];
char a[7]={‘I‘,‘V‘,‘X‘,‘L‘,‘C‘,‘D‘,‘M‘};
int b[7]={};
int n;
cin>>n;
getchar();
for(int k=0;k<n;k++)
{
int i=0;
while((str[i]=getchar())!=‘\n‘)
{
for(int j=0;j<7;j++)
{
if(str[i]==a[j])//与罗马字符进行比对
{
b[i] = j; //将对应序号存放在b中
break;
}
}
i++;
}
fun(b,i);
}
}输出结果:
2.将每个罗马字符,从左向右进行判断,如果a[i]>=a[i+1]则表明相邻的数字,左边大于右边,所以a[i]可以加到总和里面,
如果a[i]<a[i+1]就说明相邻的数字,右边大于左边,所以将a[i+1]-a[i]加到总和里面。
程序代码:
#include<iostream>
using namespace std;
int fun(int *a,int len)
{
int b[7]={1,5,10,50,100,500,1000};
int sum = 0;
int i;
for(i=0;i<len-1;)
{
if(a[i]>=a[i+1])
{
sum += b[a[i]];
i++;
}
else
{
sum += b[a[i+1]]-b[a[i]];
i += 2;
}
}
if(i<len)
{
sum += b[a[len-1]];
}
return sum;
}
int main()
{
char str[10];
char a[7]={‘I‘,‘V‘,‘X‘,‘L‘,‘C‘,‘D‘,‘M‘};
int b[7]={};
int n;
cin>>n;
getchar();
for(int k=0;k<n;k++)
{
int i=0;
while((str[i]=getchar())!=‘\n‘)
{
for(int j=0;j<7;j++)
{
if(str[i]==a[j])
{
b[i] = j;
break;
}
}
i++;
}
int num=0;
num = fun(b,i);
cout<<num<<endl;
}
}原文:http://blog.csdn.net/qsyzb/article/details/19336297