用英文单词模拟数学计算

在这里插入图片描述

不容易啊,看起来很简单的题目,花了我将近一个下午的时间,重要的是还不知道对不对,因为是别人发给我的题目,感觉答案应该不会有错了,就是担心时间超限,卑微。。。。
不过感觉也是收获挺多,这个代码是完全原创的,也是注意到了很多忽略的地方。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 15

int cut_word( char b[] ) //分离数字 ,根据单词得出A,B的值
{
    int j = 0, t , i = 0 ,a ,sum = 0;
    char bb[3][10]; //要注意数组下标是否溢出的情况;
    for( t = 0; b[t] != '\0';t++ )
    {
        if( b[t] != ' ' )
        {
            bb[ i ][ j++ ] = b[t];
        }
        else { bb[ i++][j++] = '\0';j = 0; }
    }
    bb[i++][j++] = '\0';  // 字符数组中含有空格,消去空格,将单词依次存入二维数组中
    for( i = 0 ; bb[i][0] != '\0' && i < 2 ; i++ )
    {
        if( ! strcmp( bb[i] , "zero" ) ) a = 0;
        if( ! strcmp( bb[i] , "one") ) a = 1;
        if( ! strcmp( bb[i] , "two" ) ) a = 2;
        if( ! strcmp( bb[i] , "three" ) ) a = 3;
        if( ! strcmp( bb[i] , "four" ) ) a = 4;
        if( ! strcmp( bb[i] , "five" ) ) a = 5;
        if( ! strcmp( bb[i] , "six" ) ) a = 6;
        if( ! strcmp( bb[i] , "seven" ) ) a = 7;
        if( ! strcmp( bb[i] , "eight" ) ) a = 8;
        if( ! strcmp( bb[i] , "nine" ) ) a = 9;  //判断单词对应数字

        sum = sum * 10 + a;  //求得数字
    }
    return sum;
}

void print( int k ) //输出结果,我尝试过将单词依次存入二维数组中,但是不管怎么赋值,本该是zero的单元都是乱码,未解决后尝试依次输出;
{
    switch( k )
    {
        case 0: printf("zero");break;
        case 1: printf("one");break;
        case 2: printf("two");break;
        case 3: printf("three");break;
        case 4: printf("four");break;
        case 5: printf("five");break;
        case 6: printf("six");break;
        case 7: printf("seven");break;
        case 8: printf("eight");break;
        case 9: printf("nine");break;
    }
}

int main()
{
    char b[max] ,c[max],d[max];
    while( 1 )
    {
        gets( b );
        if( b[0] == 'z' && b[7] == 'z' ) break; //只有A,B均为zero时,b[0]和b[7]才为‘z’;
        int sum1 ,sum2 ,i,j=0 ,flag = 0;

        for( i = 0; b[i] != '\0'; i++ ) //将A,B存入两个数组中,剔除加号和等号
        {
            if( !flag ) // 避免将B存入数组时破坏A所在数组,设flag限制
            {
                if( b[i] != '+' ) { c[j++] = b[i];}
                else { c[j++] = '\0'; flag = 1; j = 0; i++; }
            }

            if( flag )
            {
                if( b[i] != '=') { d[j++] = b[i];}
                else d[j++] = '\0';
            }
        }
        for( i = 0; d[i + 1] != '\0'; i++)
            d[i] = d[i+1]; //剔除d[0],d[0]的原始值为空格,会影响sum2的值
        //printf("%s1\n%s1\n",c,d);测试使用
        //由此调用函数得到以下sum1,sum2为题目所给出的数字
        sum1 = cut_word( c );
        sum2 = cut_word( d );

        int sum = sum1 + sum2;//进行加法计算
        //printf("%d\n",sum);测试使用
        if( sum >= 10 && sum < 100 )  {  print( sum / 10 ); printf(" ");print( sum % 10 ); }
        if( sum < 10 ) print( sum );//加法结果为个位数时,直接输出
        if( sum >= 100 )
        {
            print( sum / 100 ); printf(" ");
            print( sum / 10 % 10 ) ;printf(" ");
            print( sum % 10 );
        }  //分离各个位,从而依次输出单词
        printf("\n");
    }
    return 0;
}

那个未解决的问题,如果有大佬知道,请教教我啦,谢谢~~


2023.2.10更新
发现有很多人问我这个问题,就稍微再更新一下吧~因为现在很少写C了,外加步入研究生的队伍格外繁忙,所以有很多时候大家提出的问题没有及时的回复,说声Sorry~
这个题目我当时采取的暴力求解,其实思路是非常简单的:题目给出的要求是使用英文数字来进行计算,那么首先就需要我们将10个数字一一对应起来,以前我使用了二维数组来进行对应,也不是不可以,但是复杂了些。总之,解题思路如下:

第一步将数字与单词一一对应后;第二步我们肯定是需要将单词进行拆分,找到其对应数字再进行拼接,从而得到十位数字(个位数不需要拼接);第三步就是计算,将得到的两个数字进行加法计算;最后就是将得到的结果(一位数、两位数或三位数)再次拆分分别得到个位、十位、百位,再将数字用字母来表示,依次输出结果即可。

那么接下来就是真正的实现,上面写的代码我真的忘记当时为什么要这样写了 🥲 现在看起来显得很乱且稚嫩,如果让现在的我来实现,我可能会采用不同的方法实现,时间有限就简单写个框架吧,这个可能结构会更加清晰一些,各个函数所负责的功能划分明确点,大家可以在这个的基础上进行细化(不要太依赖这个代码,毕竟我有四年没写C了,大二就开始写java了😂):

//定义全局一维数组进行单词与数字的对应
word[10]={zero,one,two,......};
//定义全局字符串
string num1,num2

//function:分解题目
boolean cutWord(){
int i = 0;//用于记录题目中zero的个数
//循环扫描输入字符串,遇到空格则进行保存
//这里需要考虑:A可能为两位数,当为两位数时,十位数与个位数之间也会有个空格
num1=空格前单词;
if(num1 == zero) i++;//字符串的比较 不用if 
num2=空格后单词;
if(num2== zero) i++;

if(i == 2) return false;
return true;
}

//function:数字与字母关联
LinkWord(){
	//继续下一步,得到拆分好的两个数字单词(可能为四个单词,但是表示两个数字)
	//与一维数组进行比较,进行关联
	return 数字;
}

TransWord(){
	//将结果拆分个位、十位...
	//与一维数组进行对应
	//从最高位开始输出,每位之间空格隔开
	print();
}

int main(){
string input_test;
//输入题目
get(input_test);
//拆分题目,分解为A+B的形式
//同时判断两个数字是否为0,均为0则结束程序,否则继续计算
	while( cutWord(input_test)){
		a =LinkWord(num1);
		b = LinkWord(num2);
		sum = a+b;
		
		//将结果转化为单词表示
		TransWord(sum);
	}
	return 0}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值