/*
问题:高精度整数。实现一个加法器,使其能够输出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;
}