机试算法讲解:第29题 我也能做高精度整数的加法器,噢耶

/*
问题:高精度整数。实现一个加法器,使其能够输出a+b的值
输入:两个数a和b,其中a和b的位数不超过1000位
输出:多组测试数据,每组数据,输出a+b的值


输入:
2 6
1000 0000 0000 0000 0000             1000 0000 0000 0000 0000 0000 0000 0000
99999999 1
输出
8
1000 0000 0000 1000 0000 0000 0000 0000


思路:
用高精度做切割,当需要进位时,进行进位操作
1 求进位操作,用jinwei = 和 / 10000
2 需要将字符串从低位到高位设置成高精度数
3 低位向高位进位,注意,如果最后一个高位需要进行,还需要进行保留
4 设置字符串时要进行初始化,在进行初始化是,是设置0~1000要初始化为0
*/


#include <stdio.h>
#include <string.h>


//例如123456789,那么BigInterger[0]=6789,BigInterger[1]=2345,BigInterger[2]=1,size = 3
//常用一个结构体表示高精度整数
typedef struct BigInterger{
	int digitSize[1000];//保存大整数中若干位数字,暂用每4位为一个单位保存(先保存低位)
	int size;//为数组中第一个我们还没有使用过的数组单元


	void init()
	{
		//for(int i = 0 ; i < size ; i++)//易错,初始化应该从0到1000初始化为0
		for(int i = 0 ; i < 1000 ; i++)
		{
			digitSize[i] = 0;
		}
		size = 0;
	}
	void setStr(char* str);
	void outPut();//输出


	//需要重载+操作符
	BigInterger operator + (const BigInterger& bigInt)
	{
		//易错,这里需要设置一个临时对象
		BigInterger ret;
		ret.init();
		int iPass = 0;
		//2个高精度整数相加,从低位开始算,每四位进行累加并进位、
		for(int i = 0 ; i < size || i < bigInt.size ; i++)
		{
			//int iPass = 0 ;//设置进位标识符为0
			int iTempSum = digitSize[i] + bigInt.digitSize[i] + iPass;//这边发生未初始化造成的计算失败
			iPass = iTempSum / 10000;//获取进位数
			iTempSum %= 10000;//获取余数进行保存
			ret.digitSize[ret.size++] = iTempSum;
			//如果没有发生进位
			/*
			if(iPass==0)
			{
			}
			*/
		}
		//易错,如果出了大循环,仍然有高位需要进位,那么,就进行进位
		if(0!=iPass)
		{
			ret.digitSize[ret.size++] = iPass;
		}
		return ret;
	}
}BigInterger;


void BigInterger::setStr(char *str)
{
	//易错,刚开始要对结构体进行初始化
	init();
	int iSize = strlen(str);
	int iTempSum = 0;
	int iCount = 0 ;
	int iWeight = 1;//初始权重设为1
	for(int i = iSize - 1 ; i >= 0 ; i--)
	{
		//计算每4位的值
		iTempSum += (str[i] - '0')*iWeight;
		iWeight *= 10;
		iCount++;
		//如果已经达到4次,需要将4位的结果进行保存,并将初始变量设为初始值。或者当i==0时,到达最后一位时,也需要进行保存
		if(4==iCount || 0==i)
		{
			digitSize[size++] = iTempSum;
			//这边还需要将累加和清空
			iTempSum = 0;
			iCount = 0;
			iWeight = 1;
		}
	}
}


//输出高精度整型数,输出时从高位向低位输出,如果是首位,前面无需添0,非首位前面需要添加0
void BigInterger::outPut()
{
	bool isFirst = true;
	for(int i = size - 1; i >= 0 ; i--)
	{
		//不是首次进入的话,前面需要补充0
		if(!isFirst)
		{
			printf("%04d",digitSize[i]);
		}
		//首次进入,不需要补充0
		else
		{
			printf("%d",digitSize[i]);
			isFirst = false;
		}
	}
	printf("\n");
}


int main(int argc,char* argv[])
{
	char sA[1000],sB[1000];
	while(EOF!=scanf("%s %s",sA,sB))
	{
		BigInterger bigIntA,bigIntB;
		//bigIntA.init();//易错,自己传入进去的数字不需要赋值
		//bigIntB.init();
		bigIntA.setStr(sA);
		bigIntB.setStr(sB);
		(bigIntA + bigIntB).outPut();
	}
	getchar();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值