题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1228
这道题可以同时用两种方法做,第一种是字符串,第二种是哈希。
第一种方法:
我们可以定义一个字符串类型的二位数组,存放”zero”……”nine”十个字符串
这十个字符串可以与下标0……9一一对应。这样就可以建立字符串与数字之间的关系了
char a[][10]={"zero","one","two","three","four","five","six","seven","eight","nine"};
我们注意到输入数据中分两个部分,我们可以把每组输入看做以下格式
“第一部分”+“第二部分”=
第一部分或第二部分有可能出现两个字符串,但是中间有空格隔开,所以我们可以用%s的形式来输入。
while(scanf("%s",num)&&strcmp(num,"+")!=0){//tra函数在下面讲 A=10*A+tra(num); } while(scanf("%s",num)&&strcmp(num,"=")!=0){ B=10*B+tra(num); }
输入进来的字符串怎样处理呢?
上文我们的tra就是处理过程。
由于我们将zero……..nine 的字符串全部存在了字符串数组a中所以我们每次都必须去查找输入进来的数字字符串(num)到底对应的数字是谁。很简单咯,把a数组遍历一遍寻找相对应的字符串的下标再返回即可。
int tra(char num[]){ int i; for(i=0;i<10;i++){ if(strcmp(num,a[i])==0) return i; } }
到这里我们的程序差不多就完成了。
贴个完整的代码:
#include <iostream> #include <string.h> #include <stdio.h> using namespace std; char a[][10]={"zero","one","two","three","four","five","six","seven","eight","nine"}; int tra(char num[]){ int i; for(i=0;i<10;i++){ if(strcmp(num,a[i])==0) return i; } } int main() { int A,B; char num[10]; while(1){ A=B=0; while(scanf("%s",num)&&strcmp(num,"+")!=0){ A=10*A+tra(num); } while(scanf("%s",num)&&strcmp(num,"=")!=0){ B=10*B+tra(num); } if(A+B>0){ printf("%d\n",A+B); } else { break; } } return 0; }
接下来讲第二种方法:
我们可以使用stl中的map来让一个string串和int数映射起来。
map的使用方法大家可以上网百度,我就不详细说了
大概讲一下:
头文件是#include <map>
map<string,int>mp;表示定义了一个名称为mp的数组,
这个数组的形式是这样的:mp[string]=int;
也就是说数组的下表可以是一个字符串,如:mp[“zero”]=0,mp[“one”]=1……mp[“nine”]=9
这样的话就好办多了。
我们定义如下数组:
char f[11][6]= {"zero","one","two","three","four","five","six","seven","eight","nine"};
我们就可以用f数组来建立mp数组,确定映射
for (int i=0; i<10; i++) { mp[f[i]]=i; }
这样,映射就建立完成了。
接下来的输入跟第一种方法相似:
int A=0,B=0; while(strcmp(a,"+")!=0) { A=A*10+mp[a]; scanf("%s",a); } scanf("%s",a); while(strcmp(a,"=")!=0) { B=B*10+mp[a]; scanf("%s",a); }
贴个完整的代码:
#include<cstdio> #include<cstdlib> #include <map> #include <iostream> #include <string.h> using namespace std; map<string,int>mp; char f[11][6]= {"zero","one","two","three","four","five","six","seven","eight","nine"}; char a[1000],b[1000]; int main() { for (int i=0; i<10; i++) { mp[f[i]]=i; } while (~ scanf("%s",a)) { int A=0,B=0; while(strcmp(a,"+")!=0) { A=A*10+mp[a]; scanf("%s",a); } scanf("%s",a); while(strcmp(a,"=")!=0) { B=B*10+mp[a]; scanf("%s",a); } if (A+B==0) break; printf("%d\n",A+B); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/xdz78/article/details/47448525