您的位置:首页 > 其它

hdu 1228 A + B 详细题解 字符串/哈希

2015-08-12 18:32 295 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: