您的位置:首页 > 其它

两个大数相加,使用字符串模拟相加过程

2015-04-27 12:38 351 查看
大数相加不能直接使用基本的int类型,因为int可以表示的整数有限,不能满足大数的要求。可以使用字符串来表示大数,模拟大数相加的过程。

思路:1.反转两个字符串,便于从低位到高位相加和最高位的进位导致和的位数增加;

2.对齐两个字符串,即短字符串的高位用‘0’补齐,便于后面的相加;

3.把两个正整数相加,一位一位的加并加上进位。

具体代码如下:

[cpp] view
plaincopyprint?





/**

* 两个大数相加,且这两个大数是正整数

* 暂时不考虑负数,不考虑输入不合法的情况

* 要保证输入是正确的才能保证程序正常运行

*/

#include <stdio.h>

#include <string.h>

#define MAXSIZE 1000

int main()

{

char number1[MAXSIZE+1];

char number2[MAXSIZE+1];

char sum[MAXSIZE+2];

char temp1[MAXSIZE+1];

char temp2[MAXSIZE+1];

int len1 = 0;

int len2 = 0;

int i = 0;

int j = 0;

int maxLen = 0;

int nSum = 0;

int nCarryBit = 0;

int nOverFlow = 0;

gets(number1);

gets(number2);

//1.反转字符串,便于从低位到高位相加和最高位的进位导致和的位数增加

len1 = strlen(number1);

len2 = strlen(number2);

j = 0;

for(i = len1-1; i >= 0; --i)

{

temp1[j++] = number1[i];

}

temp1[j] = '\0';

j = 0;

for(i = len2-1; i >= 0; --i)

{

temp2[j++] = number2[i];

}

//2.把两个字符串补齐,即短字符串的高位用‘0’补齐

maxLen = (len1 > len2)?len1:len2;

if(len1 < len2)

{

for(i = len1; i < len2; ++i)

temp1[i] = '0';

temp1[len2] = '\0';

}

else if(len1 > len2)

{

for(i = len2; i < len1; ++i)

temp2[i] = '0';

temp2[len1] = '\0';

}

//3.把两个正整数相加,一位一位的加并加上进位

for(i = 0; i < maxLen; i++)

{

nSum = temp1[i] - '0' + temp2[i] - '0' + nCarryBit;

if(nSum > 9)

{

if(i == (maxLen-1))

{

nOverFlow = 1;

}

nCarryBit = 1;

sum[i] = nSum - 10 + '0';

}

else

{

nCarryBit = 0;

sum[i] = nSum + '0';

}

}

//如果溢出的话表示位增加了

if(nOverFlow == 1)

{

sum[maxLen++] = nCarryBit + '0';

}

sum[maxLen] = '\0';

//从后向前输出,即是相加后的值

for(i = maxLen-1; i >=0; --i)

putchar(sum[i]);

printf("\n");

return 0;

}

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: