题目详情:
在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。
输入是两个二十进制整数,且都大于0,不超过100位;
输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。
思路梳理:
做题不想作文,作文可以有*的空间,而做题逻辑上永远是严谨的,而我们的大脑往往不能记住所以细节,所以就必须先构架好蓝图,依图行事,
1.设两个字符串为A,B,那我就要找出二者间长度最长的一个,设其长度为length
我要定义一个长度为length+1的数组ans来存放答案,为什么要+1呢,因为会有一种情况,如j+1,答案是10,也就是有进位,这个length+1的位就是专门为这位进位爷准备的
2.把a里面的内容存入ans。
3.把b中的内容加到ans上
这里就有一个误区了,天然的思维是这样,5位的a加1位的b,那么就只需要对1位的b中的每一位做一次加。
那么像这个例子:jjj+1就会得jj0.
所以说,a位加b位的字符串,应该加其中相对长度较长的那个的长度,当然,如果进位位为0时,也可以终止。
Source Code:
#include<stdio.h> #include<string.h> #include<ctype.h> char ans[100]; char* calculate(char *a,char *b){ int lengtha = strlen(a); int lengthb = strlen(b); int lengthans = (lengtha > lengthb ? (lengtha+1) : (lengthb+1)); int i,j,k = lengtha; char tmp,ci = 0; for(i = lengtha; i < lengthans; i++) ans[i-k] = 0; for(i = 0; i < lengtha; i++) { if(a[i] >= 48 && a[i]<=57) ans[i+(lengthans - lengtha)] = (a[i] - ‘0‘); else ans[i+(lengthans - lengtha)] = (a[i] - ‘a‘ + 10); } j = lengthans - lengthb; while(lengthb > 0) { tmp = b[lengthb-1]; if(b[lengthb-1] >= 48 && b[lengthb-1]<=57) tmp = tmp - ‘0‘; else tmp -= (‘a‘ - 10); if((tmp + ci + ans[lengthb+j-1]) >= 20) { ans[lengthb+j-1] += (tmp+ci-20); ci = 1; } else { ans[lengthb+j-1] += (tmp+ci); ci = 0; } lengthb--; } while(ci > 0)//这里就是步骤3中那个常见的误区 { ans[lengthb + j - 1] += ci; if(ans[lengthb + j - 1] < 20) break; ans[lengthb + j - 1] -= 20; ci = 1; lengthb--; } for(i = 0; i < lengthans; i++) if(ans[i] >= 0 && ans[i]<=9) ans[i] += ‘0‘; else ans[i] += (‘a‘-10); if (ans[0] != ‘0‘) //这样的返回字符串的形式还是头一次见 return ans; else return &ans[1]; } int main(){ char a[102]; char b[102]; while(scanf("%s %s",a,b) != EOF){ printf("Ans = %s\n",calculate(a,b)); } }