大数系列——大数加法

这几天专门学习了一下大数的有关计算方法,大数加减乘除模都会在后面讲到。

一、大数加法:

加法算是最简单的一类大数问题,先写上我的代码:

#include
#include
using namespace std;
char num1[111], num2[111], num3[111];
int L, M;
int mark;
void add(char a[], char b[], char c[]){
	int len1 = strlen(a);
	int len2 = strlen(b);
	int i, j;
	int l = 0;
	L = 0;
	int temp;
	for(i = 0; i < len1/2; i++){
		temp = a[i];
		a[i] = a[len1-1-i];
		a[len1-1-i] = temp;
	}//把输入的两个大数都逆序排列,这个循环很常见,可以专门写一个函数。
	for(i = 0; i < len2/2; i++){
		temp = b[i];
		b[i] = b[len2-1-i];
		b[len2-1-i] = temp;
	}
	for(i = 0; i < len1 && i < len2; i++){
		M = (a[i] - '0' + b[i] - '0' + L) % 10;
		L = (a[i] - '0' + b[i] - '0' + L) / 10;
		c[i] = M + '0';
	}//M是代表这一位的数,L是代表这一位两数相加后的十位数,也就是进位数的大小
	if(i < len1){
		for( ; i < len1; i++){
		M = (a[i] - '0' + L) % 10;
		L = (a[i] - '0' + L) / 10;
		c[i] = M + '0';
		}
	}
	if(i < len2){
		for( ; i < len2; i++){
		M = (b[i] - '0' + L) % 10;
		L = (b[i] - '0' + L) / 10;
		c[i] = M + '0';
		}
	}
	while(L){
		c[i++] = L + '0';
		L /= 10;
	}//最后一位的进位不要忘记
	mark = i-1;
}//这个方法比较常见,最好要牢牢掌握

/*while(len1 >= 0 && len2 >= 0){
M = (a[len1] - '0' + b[len2] - '0' + L) % 10;
L = (a[len1] - '0' + b[len2] - '0' + L) / 10;
c[l++] = M + '0';
len1--;
len2--;
}
while(len1 >= 0){
M = (a[len1] - '0' + L) % 10;
L = (a[len1] - '0' + L) / 10;
c[l++] = M + '0';len1--;
}
while(len2 >= 0){
M = (b[len2] - '0' + L) % 10;
L = (b[len2] - '0' + L) / 10;
c[l++] = M + '0';len2--;
} 
while(L){
c[l++] = L + '0';
L /= 10;
}
for(i = 0; i < l/2; i++){
temp = c[i];
c[i] = c[l-1-i];
c[l-1-i] = temp;
}
for(i = 0; i < l; i++)
printf("%c",c[i]);*/
int main(){
int i, j;
int len1, len2;
scanf("%s%s",num1,num2);
len1 = strlen(num1);
len2 = strlen(num2);
add(num1,num2,num2);
for(i = mark; i >= 0; i--)
printf("%c",num2[i]);
printf("\n");
return 0;
}

 
  

1、用现在的方法而不用我之前的方法是因为现在这个方法灵活性更强,它可以把结果保存在相加的两个字符串的任意一个里,我之前的方法,是没有逆序排列的,所以说,这意味着只能先求出字符串长度len,再从len-1到0来逐位相加,这样我们就必须把相加的结果保存在第三个字符串里,浪费了内存。

2、用现在的方法,稍加修改,便可以实现连续多个大数相加。

多个大数连续相加代码如下:

#include
#include
using namespace std;
char num1[111], num2[111], num3[111];
int L, M;
int mark;
void reverse(char a[]){//逆序倒置函数
	int len = strlen(a);
	int i;
	int temp;
	for(i = 0; i < len/2; i++){
		temp = a[i];
		a[i] = a[len-1-i];
		a[len-1-i] = temp;
	}
}
void add(char a[], char b[], char c[]){
	int len1 = strlen(a);
	int len2 = strlen(b);
	int i;
	int l = 0;
	L = 0;
	reverse(a);
	reverse(b);
	for(i = 0; i < len1 && i < len2; i++){
		M = (a[i] - '0' + b[i] - '0' + L) % 10;
		L = (a[i] - '0' + b[i] - '0' + L) / 10;
		c[i] = M + '0';
	}
	if(i < len1){
		for( ; i < len1; i++){
		M = (a[i] - '0' + L) % 10;
		L = (a[i] - '0' + L) / 10;
		c[i] = M + '0';
		}
	}
	if(i < len2){
		for( ; i < len2; i++){
		M = (b[i] - '0' + L) % 10;
		L = (b[i] - '0' + L) / 10;
		c[i] = M + '0';
		}
	}
	while(L){
		c[i++] = L + '0';
		L /= 10;
	}
	mark = i-1;
}
int main(){
	int i;
	int len1, len2;
	memset(num2,0,sizeof(num2));
	while(scanf("%s",num1) && strcmp(num1,"0")){
	len1 = strlen(num1);
	len2 = strlen(num2);
	add(num1,num2,num2);//看,这样我们就能仅仅用两个字符串就完成了多个大数相加的功能
	reverse(num2);
	}
	for(i = 0; i <= mark; i++)
		printf("%c",num2[i]);
	printf("\n");
	return 0;
}

加法就写到这里。

你可能感兴趣的:(大数系列)