九度OJ_1010


作者:小代码


时间: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 );
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值