作者:小代码
时间:2013年7月20日1:45:08
IDE:CodeBlocks
- 题目描述:
-
读入两个小于100的正整数A和B,计算A+B.
需要注意的是:A和B的每一位数字由对应的英文单词给出.
- 输入:
-
测试输入包含若干测试用例,每个测试用例占一行,格式为"A + B =",相邻两字符串有一个空格间隔.当A和B同时为0时输入结束,相应的结果不要输出.
- 输出:
-
对每个测试用例输出1行,即A+B的值.
- 样例输入:
-
one + two = three four + five six = zero seven + eight nine = zero + zero =
- 样例输出:
-
3 90 96
算法描述:
算法描述:
1、如何结束输入
题目要求输入(<>之内的):<zero + zero => 时结束,所以不能在while()中使用EOF,或许有这种办法,我是想不出来了。
所以我采用的实while( true )( true 用的实const变量),把所有的程序代码包含在一个循环中
2、获取原始数据
此题明显是字符串分析,但是如果用scanf()接收的话,就不能用Ctrl + Z 结束。
所以我用的是getchar(),每一行的输入都是以 = 结束,则可以以 = 作为结束接收一行的判断符号。
把每一行接收的字符全部保存在一个字符数组里面
3、数据分析
既然是两个整数的相加,而且又是用字符数组保存原始数据,所以 + 就是两个表示加数的单词的分界点
3.1 分割
求得 + 的位置
3.2 保存
把前后两个字符串保存在两个字符数组中
3.3 转换
把两个字符数组转换为整数
3.3.1 搜索单词位置
3.3.2 保存单词
3.3.3 根据单词,返回相应数字
3.3.4 处理两位数
4、 输出结果
如果两个加数都不为0,则输出相加结果,否则结束程序
C语言通过版:
#include<stdio.h> #include<stdlib.h> #include<string.h> const int TRUE = 1; int main( void ) { int wordTonum( char *addend );//把英文转换成数字 int tonum( char *str );//把基数词转换成个位数 int Mystrchr( char *word, char ch );//返回字符在指定字符串中第一次出现的位置 void divison( char *addend_A, char *addend_B, char *word );//分割 char word[30];//保存每次输入的一行字符串 int i = 0;//存储循环控制 char *addend_A[11];//保存第一个数字的英文 char *addend_B[11];//保存第二个数字的英文 int A;//第一个数 int B;//第二个数 char in;//接收字符 while( TRUE ) { in = getchar(); if( '=' == in ) { word[i] = '\0';//人为设置字符串结束符 divison( addend_A, addend_B, word );//分割 A = wordTonum( addend_A );//提取数字 B = wordTonum( addend_B );//提取数字 if( 0 == A && 0 == B ) { exit(0); } else { printf("%d\n",A+B);//输出结果 getchar();//接收回车键 i = 0;//输入循环变量归零 } } else { word[i] = in; i++; } } return 0; } //返回字符在指定字符串中第一次出现的位置 int Mystrchr( char *word, char ch ) { int blog = -1; int len = strlen( word ); int i; for ( i = 0; i < len; i++ ) { if ( word[i] == ch ) { blog = i; break; } } return blog; } //分割 void divison( char *addend_A, char *addend_B, char *word ) { int jia = 0;//保存 + 位置 int i; int j = 0; int len = strlen( word ); jia = Mystrchr( word, 43 );//得出 + 的位置 for( i = 0; i < jia - 1; i++,j++ )//分割出addend_A { *( addend_A + j ) = *( word + i ); } *( addend_A + j ) = '\0'; j = 0; i = jia + 2; for( ; i < len - 1; i++,j++ )//分割出addend_A { *( addend_B + j ) = *( word + i ); } *( addend_B + j ) = '\0'; } //把基数词转换成个位数 int tonum( char *str ) { int blog = -1; if( 0 == strcmp( str, "zero") ) { blog = 0; } else if( 0 == strcmp( str, "one") ) { blog = 1; } else if( 0 == strcmp( str, "two") ) { blog = 2; } else if( 0 == strcmp( str, "three") ) { blog = 3; } else if( 0 == strcmp( str, "four") ) { blog = 4; } else if( 0 == strcmp( str, "five") ) { blog = 5; } else if( 0 == strcmp( str, "six") ) { blog = 6; } else if( 0 == strcmp( str, "seven") ) { blog = 7; } else if( 0 == strcmp( str, "eight") ) { blog = 8; } else if( 0 == strcmp( str, "nine") ) { blog = 9; } return blog; } //把英文转换成数字 int wordTonum( char *addend ) { int len= strlen( addend ); int kong; char ge[6];//个位数字字符串 char shi[6];//十位数字字符串 int a = 0;//个位数字 int b = 0;//各位数字 int i; int j = 0; kong = Mystrchr( addend, 32 );//空格位置 if( -1 == kong )//如果没有空格,则只有一个基数单词 { return tonum( addend ); } else//加数有两个基数单词 { for( i = 0; i < kong; i++ )//提取十位数字字符串 { shi[j] = addend[i]; j++; } shi[j] = '\0';//人为设置字符串结束符号 j = 0;//提取循环控制变量归零 for( i = kong + 1; i < len; i++ )//提取个位数字字符串 { ge[j] = addend[i]; j++; } ge[j] = '\0';//人为设置字符串结束符号 a = tonum( ge );//得到个位数字 b = tonum( shi );//得到十位数字 return ( a + b * 10 ); } }