作者:小代码
时间: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 );
}
}