首页 > 代码库 > [ACM] hdu 1228 A+B (字符串处理)
[ACM] hdu 1228 A+B (字符串处理)
A + B
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11543 Accepted Submission(s): 6699
Problem Description
读入两个小于100的正整数A和B,计算A+B.
需要注意的是:A和B的每一位数字由对应的英文单词给出.
需要注意的是:A和B的每一位数字由对应的英文单词给出.
Input
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.
Output
对每个测试用例输出1行,即A+B的值.
Sample Input
one + two =three four + five six =zero seven + eight nine =zero + zero =
Sample Output
39096
Source
浙大计算机研究生复试上机考试-2005年
解题思路:
以加号为界限,左右两个加数分别存到一个字符串里面,再在每个字符串中提取出来加数。
代码:
方法1:使用substr函数,手动判断空格
#include <iostream>#include <string.h>using namespace std;int change(string str)//字符串转换成数字{ int d; if(str=="zero") d=0; else if(str=="one") d=1; else if(str=="two") d=2; else if(str=="three") d=3; else if(str=="four") d=4; else if(str=="five") d=5; else if(str=="six") d=6; else if(str=="seven") d=7; else if(str=="eight") d=8; else if(str=="nine") d=9; return d;}int main(){ string exp;//输入的一行 string A,B;int a,b;//A,B分别代表加号左,右的数的字符串,a,b分别为两个加数的值 while(getline(cin,exp)) { int len=exp.length(); int j; int tap1,tap2; for(j=0;j<len;j++) { if(exp[j]==‘ ‘&&exp[j+1]==‘+‘) tap1=j;//tap1为第一个数右边的空格 if(exp[j]==‘ ‘&&exp[j+1]==‘=‘) tap2=j;//tap2为第二个数右边的空格 } A=exp.substr(0,tap1);//提取,开始位置为0,提取长度为tap1 B=exp.substr(tap1+3,tap2-tap1-3); int lenA=A.length(); int lenB=B.length(); a=b=0; int pre=-1; for(int i=0;i<lenA;i++) { if(A[i]==‘ ‘) { a=a*10+change(A.substr(pre+1,i-pre-1)); pre=i; } if(i==lenA-1)//和空格的情况不太一样,要多读取一位 a=a*10+change(A.substr(pre+1,i-pre)); } pre=-1; for(int i=0;i<lenB;i++) { if(B[i]==‘ ‘) { b=b*10+change(B.substr(pre+1,i-pre-1)); pre=i; } if(i==lenB-1) b=b*10+change(B.substr(pre+1,i-pre)); } if(a==0&&b==0) break; cout<<a+b<<endl; } return 0;}
方法2,3:(输入时,自动忽略空格,把每个单词放入到一个字符数组中)
代码1:
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;char s[100][100];int change(char str[]){ int d; if(str[0]==‘z‘)//不能str=="zero" d=0; else if(str[0]==‘o‘) d=1; else if(str[0]==‘t‘&&str[1]==‘w‘) d=2; else if(str[0]==‘t‘&&str[1]==‘h‘) d=3; else if(str[0]==‘f‘&&str[1]==‘o‘) d=4; else if(str[0]==‘f‘&&str[1]==‘i‘) d=5; else if(str[0]==‘s‘&&str[1]==‘i‘) d=6; else if(str[0]==‘s‘&&str[1]==‘e‘) d=7; else if(str[0]==‘e‘) d=8; else if(str[0]==‘n‘) d=9; return d;}int main(){ int a,b; int c = 0; while(~scanf("%s", s[c])){//先输入第一个单词 c = 1; char ch; while(scanf("%s%c",s[c], &ch)){//以空格为界限,读入每个单词,字符数组不读空格 if(ch == ‘\n‘)//退出条件 break; c++; } int ok=0; a=b=0; for(int i=0;i<c;i++) { if(s[i][0]==‘+‘) { ok=1; continue; } if(ok==0) a=a*10+change(s[i]); else if(ok==1) b=b*10+change(s[i]); } if(a==0&&b==0) break; cout<<a+b<<endl; c = 0; } return 0;}
代码2:
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;char s[100][100];int change(char str[]){ int d; if(str[0]==‘z‘)//不能str=="zero" d=0; else if(str[0]==‘o‘) d=1; else if(str[0]==‘t‘&&str[1]==‘w‘) d=2; else if(str[0]==‘t‘&&str[1]==‘h‘) d=3; else if(str[0]==‘f‘&&str[1]==‘o‘) d=4; else if(str[0]==‘f‘&&str[1]==‘i‘) d=5; else if(str[0]==‘s‘&&str[1]==‘i‘) d=6; else if(str[0]==‘s‘&&str[1]==‘e‘) d=7; else if(str[0]==‘e‘) d=8; else if(str[0]==‘n‘) d=9; return d;}int main(){ while(1) { char ch; int a,b; int c=0; while(scanf("%s%c",s[c],&ch))//输入每个单词 { if(ch==‘\n‘) break; c++; } int ok=0; a=b=0; for(int i=0;i<c;i++)//s[c]里面在该题存的是”=“,没用 { if(s[i][0]==‘+‘) { ok=1; continue; } if(ok==0) a=a*10+change(s[i]); else if(ok==1) b=b*10+change(s[i]); } if(a==0&&b==0) break; cout<<a+b<<endl; } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。