二十进制的加法

题目描述:


        在二十进制中,我们除了使用数字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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值