二十进制数的加法--【英雄会】
今天晚上看到群里面交流的信息,发现又出新题了,看了一下,难度还可以,是一般性的题目。事实如此,大家一说简单,一会儿就由三星难度降为二星了…题目不少,有兴趣的朋友们可以去英雄会……
如题:
在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。 输入是两个二十进制整数,且都大于0,不超过100位;
输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。
总的来说,这一题难度还可以,只要注意点没忘记,大家应该都是没问题的;
首先是简单的两个数相加“122” + “221”,当然就是“343”,只要进行正常加减即可;
接下来是“1aa” + “222”,结果是“3cc”;
以上这两个实例只要将数所对应的数相加即可;
接下来考虑进位问题:
“1aa” + “22a”,结果是“3d0”;
这时我们需要考虑进位问题,并将进位标记传到前一个;
最后是考虑两个数位数不同的数字,这时我们将两个较短的一个数首先加完,最后将长的数前面补上即可,但是这时我们得考虑之前加完的进位问题。
如对”jaa”+”aa”,a+a=20,进位1;a+a+1=21;再次进位1;j+1=20;再次进位1;结果为”1010″;
总体来说,这一题不是什么算法的问题,我们将逻辑弄清楚即可;
想必这些对大家都是“so easy”…贴上代码,未做过多优化,但是思路清晰:
#include <stdio.h> #include <stdlib.h> #include <string.h> char start[21] = {\'0\', \'1\', \'2\', \'3\', \'4\', \'5\', \'6\', \'7\', \'8\', \'9\', \'a\', \'b\', \'c\', \'d\', \'e\', \'f\', \'g\', \'h\', \'i\', \'j\'}; char* calculate (char* x,char* y) { int length, lengthA, lengthB; int i, index = 0; int poor; int temp; char* num = (char *)malloc (102); for(i = 0; i < 102; i++) num[i] = \'\0\'; lengthA = strlen(x); //数x的长度 lengthB = strlen(y); // length = lengthA; if(length > lengthB) //找到较短的数,对其进行相加 length = lengthB; for(i = 0; i < length; i++) { poor = x[lengthA - i - 1] + y[lengthB - i - 1] - \'0\' - \'0\'; //将两个数进行相加 while(poor > 40) //被加数出现>=\'a\'的,-39即是加上10 poor -= 39; //a的ascii是97,0的ascii是48 if(poor >= 20) //>20,进位 { poor -= 20; num[i] = start[poor + index]; index = 1; //标记进位 } else { if(poor + index >= 20) //借助上一次的index成功进位,如对"ja"和"a" { poor -= 19; num[i] = start[poor]; index = 1; } else //进行普通相加 { num[i] = start[poor + index]; index = 0; } } } for(i = length; i < lengthA; i++) //若x的长度长于y { poor = x[lengthA - i - 1] - \'0\'; if(poor > 40) poor -= 39; if(poor + index >= 20) { poor -= 19; num[i] = start[poor]; index = 1; } else { num[i] = start[poor + index]; index = 0; } } if(index == 1 && lengthA > lengthB) { num[i] = start[1]; index = 0; } for(i = length; i < lengthB; i++) //若y的长度长于x { poor = y[lengthB - i - 1] - \'0\'; if(poor > 40) poor -= 39; if(poor + index >= 20) { poor -= 19; num[i] = start[poor]; index = 1; } else { num[i] = start[poor + index]; index = 0; } } if(index == 1) { num[i] = start[1]; } index = strlen(num); //此时index是num的长度,进行反转 for(i = 0; i < index / 2; i++) { temp = num[i]; num[i] = num[index - i - 1]; num[index - i - 1] = temp; } return num; } //start 提示:自动阅卷起始唯一标识,请勿删除或增加。 int main() { printf("%s",calculate("jaa","aa")); return 0; } //end //提示:自动阅卷结束唯一标识,请勿删除或增加。
修订:在进行后length位相加部分的代码可进行如下优化;
for(i = 0; i < length; i++) { poor = x[lengthA - i - 1] + y[lengthB - i - 1] - \'0\' - \'0\'; //将两个数进行相加 while(poor > 40) //被加数出现>=\'a\'的,-39即是加上10 poor -= 39; //a的ascii是97,0的ascii是48 if(poor + index >= 20) //>20,进位 { poor = poor + index - 20; num[i] = start[poor]; index = 1; //标记进位 } else { num[i] = start[poor + index]; index = 0; } }
不足之处,还请大家指点…
o(∩_∩)o