题目描述:
在二十进制中,我们除了使用数字0-9以外,还使用字母a-j(表示10-19),给定两个二十进制整数,求它们的和。 输入是两个二十进制整数,且都大于0,不超过100位; 输出是它们的和(二十进制),且不包含首0。我们用字符串来表示二十进制整数。
分析:在第一眼看到这道题的时候,我相信你也会有一个思路:从两字符的右端开始操作,并且每次都将相应的字符转化为十进制后再相加,如果有进位就将进位1加到下一位高位上,最后再将得到的额十进制结果转化为字符存储起来。当我们将所有数加完之后,你也许会发现,假如最高位有进位,那怎么办呢?这个问题还是要解决的,而且不难解决,只要我们将保存结果的字符数组声明比输入两个数的长度最长的那个长度+1就可。最终判断最高位是否溢出,如果溢出,那么就将最高位设置为字符1,否则,则将最高为去掉后再返回地址在输出。本人就根据这个思路把代码实现了,但是由于初出茅庐,代码质量不是很好,请见谅。注释只注释前一部分,因为后一部分和前面的大致一样意思。
算法实现:
char* calculate(char* x, char* y)
{
int tempx, tempy,site,cf=0;//定义临时x,y以及标志site,是否有进位cf
int i,clen,lenx,leny,len;//clen为两字符长度差
char *sum;//存放结果
//x、y的长度
lenx = strlen(x);
leny = strlen(y);
//判断x、y的长度
if (lenx>leny)
{
site = 1;
clen = lenx - leny;
len = lenx;
}
else
{
site = 0;
clen = leny - lenx;
len = leny;
}
sum = (char *)malloc((len+1) * sizeof(char));
memset(sum, 0, sizeof(sum));
//从字符后面算起,即低位算起
for (i = len - 1; i >=0; i--)
{
if (site==1)//如果x比y的长度长
{
//字符转为十进制
if (x[i]<='9')
{
tempx=x[i] - '0';
tempy = 0;
}
else
{
tempx = x[i] - 87;
tempy = 0;
}
if (i >= clen)//将字符短的y停止,因为y已算完
{
if (y[i - clen] <= '9')
{
tempy = y[i - clen] - '0';
}
else
{
tempy = y[i - clen] - 87;
}
}
//转化为二十进制,保存结果
if (cf + tempx + tempy>=20)//该位置的和大于等于20,则有进位
{
if (cf + tempx + tempy>29)
{
sum[i+1] = cf + tempx + tempy + 67;
}
else
{
sum[i + 1] = cf + tempx + tempy + 28;
}
cf = 1;
}
else
{
if (cf + tempx + tempy > 9)
{
sum[i + 1] = cf + tempx + tempy + 87;
}
else
{
sum[i + 1] = cf + tempx + tempy + 48;
}
cf = 0;
}
}
else//如果x比y的长度短
{
if (y[i]<='9')
{
tempy = y[i] - '0';
tempx = 0;
}
else
{
tempy = y[i] - 87;
tempx = 0;
}
if (i >= clen)
{
if (x[i - clen] <= '9')
{
tempx = x[i - clen] - '0';
}
else
{
tempx = x[i - clen] - 87;
}
}
if (cf+tempx + tempy>=20)
{
if (cf+tempx + tempy>29)
{
sum[i + 1] = cf + tempx + tempy + 67;
}
else
{
sum[i + 1] = cf + tempx + tempy + 28;
}
cf = 1;
}
else
{
if (cf+tempx + tempy > 9)
{
sum[i + 1] = cf + tempx + tempy + 87;
int aaaa = 0;
}
else
{
sum[i + 1] = cf + tempx + tempy + 48;
}
cf = 0;
}
}
}
if (cf==1)
{
sum[0] = 49;
}
else
{
sum++;
}
return sum;
}