題目鏈接: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;
}