题目链接: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
#include
#include
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
这个数组的形式是这样的: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
#include
#include