题目描述:
古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现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