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