大整数乘法和加法

今天晚上突然想到这个大整数的乘法和加法还没有通过自己的验证,所以尽快地写了一个程序。其中遇到的问题有很多。
1. 在每次做数组的转换时,要考虑顺序,先加到后一位,再求余
2. char转化为int类型的时候要减去0的assic码
3. 最后一个问题就是到底结果有多少位,加法的位数最多为最长整数的位数加一;乘法的位数最多是两个整数位数相加。
4. 另外一点char *a="9876",这是一个字符常量,最好在前面加一个const。
5. 动态数组在创建时内置类型是没有初始化的, 所以如果不初始化将产生不可预料的错误。在创建时一定要初始化。

#include <iostream>
using namespace std;

void transform(int *a, int length){
	for (int i = 0; i < length; ++i){
		a[i+1] += a[i]/10;
		a[i] %= 10;//考虑顺序,先加到后一位,然后再求余
	}
}

int *bigmultiple(const char *a, int a_length, const char *b, int b_length){
	int *c = new int[a_length + b_length + 1]();
	for (int i = 0; i < b_length; ++i){
		for (int j = 0; j < a_length; ++j){
			c[i+j] += (a[j]-'0') * (b[i]-'0');
			
		}
                transform(c,i+a_length+1);
	}
	return c;
}

int *bigadd(const char *a, int a_length, const char *b, int b_length,
		int &length){
	int max = a_length>b_length?a_length+1:b_length+1;
	int *c = new int[max]();
	int i = 0, j=0;
	while (i < a_length && j < b_length){
		c[i] = a[i] - '0' + b[i] - '0';
		i++;
		j++;
	}
	if (i < a_length){
		while (i < a_length){
			c[i] += a[i]-'0';
			i++;
		}
	}
	else {
		while (j < b_length){
			c[j] += b[j]-'0';
			j++;
		}
	}
	transform(c, max);
	length = max;
	return c;
}

int main(){
	const char *a = "12345678901234567890123456789";
	int a_length = 29;
	const char *b = "012345678909876543210123456789";
	int b_length = 30;
	int *c;
	/*
	c = bigmultiple(a, a_length, b, b_length);
	
	for (int i = a_length+b_length-1; i >= 0; --i){
		cout << c[i];
	}//输出可能出现问题,不使用此方法输出
	cout << endl;
	int d[] = {12, 34, 56, 78, 32, 34, 35, 35};
	transform(d, 8);
	for (int i = 0; i < 8; ++i)
		cout << d[i];
		*/
	int length;
	c = bigadd(a, a_length, b, b_length, length);
输出
	for (int i = 0; i < length; ++i){
		cout << c[i];
	}//这样输出可能会出现问题
可以这样输出
int i = length;
while (a[length==0)
--i;
while (i >= 0)
cout << c[i];
	cout << endl;
	delete []c;
	return 0;
}

计算98765432109876543210987654321×987654321012345678909876543210
的结果,答案是这样的:
97546105789971040991098917846802316719900015241577899710410

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 大整数加法和乘法是计算机科学中常见的问题。大整数通常比机器原生数据类型表示的整数要大得多,因此需要采用特殊的算法来进行计算。 首先,我们来实现大整数加法。假我们有两个整数num1和num2,我们需要从最低位开始逐位相加,并且记录进位。具体的步骤如下: 1. 定义两个指针i和j分别指向num1和num2的最低位。 2. 初始化进位carry为0,并创建一个空的数组result用来存放结果。 3. 进行循环,直到指针i和j都越界: a. 将当前位的数字相加,加上进位carry,并将结果存放在sum变量中。 b. 将sum对10取余的结果添加到result数组中。 c. 更新进位carry为sum除以10的结果。 d. 更新指针i和j分别为下一位。 4. 如果carry不为0,将其添加到result数组的最高位。 这样就完成了大整数加法。 接下来,我们来实现大整数的乘法。同样地,我们需要从最低位开始逐位相乘,并且记录进位。具体的步骤如下: 1. 定义两个指针i和j分别指向num1和num2的最低位。 2. 初始化进位carry为0,并创建一个空的数组result用来存放结果。 3. 进行嵌套循环,外层循环遍历num1的每一位,内层循环遍历num2的每一位: a. 将当前位的数字相乘,加上进位carry,并将结果存放在product变量中。 b. 将product对10取余的结果添加到result数组中的对应位置。 c. 更新进位carry为product除以10的结果。 d. 更新指针j为下一位。 e. 将进位carry添加到result数组的下一个位置。 f. 更新指针i为下一位,重置指针j为num2的最低位。 4. 如果carry不为0,将其添加到result数组的最高位。 这样就完成了大整数的乘法。 总结起来,大整数加法和乘法都可以通过从最低位开始逐位相加或相乘,并记录进位来实现。需要注意的是,使用数组来存放结果,可以处理大整数不同位数的情况。 ### 回答2: 大整数加法和乘法的实现可以使用字符串来表示大整数,并按照进位运算的方法进行计算。 大整数加法的步骤如下: 1. 将两个整数的字符串表示形式补齐到相同长度,可以在较短的字符串前面补0。 2. 从字符串的末尾(个位)开始遍历,将对应位置的数字相加。 3. 若相加的结果大于等于10,则需要进位。将进位的数字加到下一位的运算结果中。 4. 将每次相加的结果依次加入一个新的字符串中。 5. 如果最高位相加后有进位,则需要在最终结果的最前面加上进位。 大整数乘法的步骤如下: 1. 遍历两个整数的字符串表示,将第一个数的每一位与第二个数的每一位相乘。 2. 通过一个二维数组来保存相乘的结果,其中每一行表示第一个数的一位与第二个数相乘的结果,乘积的每一位按照对应的位数存储。 3. 对于乘积的每一位,先计算当前位置上的乘积结果,然后将前一位(进位)加到当前位上。 4. 将每一位的结果依次加入一个新的字符串中。 5. 最后需要将每一位的结果按照进位的方式处理,直到最高位没有进位为止。 通过以上步骤,可以实现大整数加法和乘法的功能。这种方法适用于任意长度的大整数计算,无需考虑整数的大小限制。 ### 回答3: 要实现大整数加法和乘法,我们可以使用字符串来表示大整数,并模拟手工计算的过程进行运算。 对于加法,我们从个位开始按位相加,如果有进位则向前一位进位,直到所有位数相加完成,最后将结果拼接成新的字符串即可。 对于乘法,我们需要将每个位上的数字与另一个整数的每个位上的数字相乘,然后将结果按位相加,也就是说,我们从被乘数的个位开始,与乘数的每一位相乘,然后将结果保留到相应的位置。在进行下一位的计算时,需要将之前的结果整体往前进一位,因为每一位的值是乘数的某一位与当前被乘数位相乘的结果。最后将所有位的结果相加,得到最终的乘积。 需要注意的是,由于大整数可能会超过计算机能表示的范围,我们不能使用内置的整数类型进行运算,而要使用字符串来模拟整数的计算过程。在实现乘法时,还需要考虑到进位的情况。 总的来说,实现大整数加法和乘法需要注意好运算顺序和进位的处理,通过模拟手工计算的过程,可以得到正确的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值