大数问题:大数加法、乘法、除法

大数加法

  • 问题描述:求两个不超过200位的非负整数的和
    举例:
     1 2 3 4 5 6 7 8 9
    +1 2 3 4 5 6 7 8 9
    --------------------------
    2 4 6 8 10 12 14 16 18
    首先存的时候为:9 8 7 6 5 4 3 2 1+ 9 8 7 6 5 4 3 2 1;原因是最高位可能存在进位,所以需要倒叙存储。最后进位后倒叙: 2 4 6 9 1 3 5 7 8
    解析: 用数组来保存大数,先数组倒叙,然后对应位置相加,最后处理进位,输出。

参考代码:

#include
using namespace std;

void main() {
	char s[202];   //存大数
	int sum[201];  //计算和的结果
	int i, j, d, len, maxlen = 0;
	for (int i = 0; i < 201; i++)
		sum[i] = 0;  //结果清零,初始化
	for (i = 0; i < 2; i++) {   //读入两个大数
		cin >> s;
		len = strlen(s);
		if (len > maxlen)
			maxlen = len;
		for (j = len - 1; j >= 0; j--)
			sum[len - 1 - j] += s[j] - '0';
	}
	for (i = 0, d = 0; i < maxlen; i++) {    //处理数组sum里面的进位
		sum[i] += d;
		d = sum[i] / 10;
		sum[i] %= 10;
	}
	if (d > 0)      //最后一位有进位的情况
		sum[maxlen++] += d;
	for (i = maxlen - 1; i >= 0; i--)   //结果倒叙回来
		s[maxlen - 1 - i] = sum[i] + '0';
	s[maxlen] = '\0';
	cout << s << endl;
	cin.get();
	return;
}

大数乘法

  • 问题描述:求两个不超过50位的非负整数的积。
    样例:
    12345678900
    98765432100
    输出:
    1219326311126352960000
    分析:使用数组存储大数,然后数组的每一个数字表示大数的一位元素,按位进行计算,处理结果进位,最后输出。参考手算乘法的方式,只是计算时候先不进位,进位最后进行统一处理。

参考代码:

#include
#include
using namespace std;

void main() {
	char sa[51], sb[51], sc[101];
	int a[50], b[50], c[100], i, j, k, d, aLen, bLen;
	cin >> sa;
	cin >> sb;
	for (int i = 0; i < 50; i++) {
		a[i] = 0;
		b[i] = 0;
	}
	aLen = strlen(sa);
	i = aLen - 1; k = 0;
	while (i >= 0) {
		a[k++] = sa[i--] - '0';
	}
	bLen = strlen(sb);
	i = bLen - 1; k = 0;
	while (i >= 0) {
		b[k++] = sb[i--] - '0';
	}
	//结果数组清零
	for (i = 0; i < 100; i++)
		c[i] = 0;
	for (i = 0; i < aLen; i++) {
		for (j = 0; j < bLen; j++) {
			c[i + j] += a[i] * b[j];
		}
	}
	k = 99;
	while (k >= 0 && c[k] == 0)//寻找到最高位
		k--;
	i = 0; d = 0;
	while (i <= k) {
		c[i] += d;
		d = c[i] / 10;
		c[i] %= 10;
		i++;
	}
	while (d > 0) {  //处理最高位进位
		c[i] = d % 10;
		d = d / 10;
		i++;
	}
	k = i;//乘积的最高位
	for (i = k - 1; i >= 0; i--) {//转换回字符串
		sc[k - 1 - i] = c[i] + '0';
	}
	sc[k] = '\0';
	cout << sc << endl;
	cin.get();
	return;
}

大数除法

问题描述:求两个大的正整数相除的商
输入:
第一行:测试的组数;
第二行:被除数
第三行:除数
输出:

问题分析:
除法本质商就是一个减法,看被除数里面有多少个除数的整数倍,当然挨着一个一个的减法有点慢。可以进行除数的1倍、10倍、100倍、1000倍的减法,减法的次数就快了。
例如:7546=23*100*3+23*10*2+23*8;结果为:328

参考代码:


你可能感兴趣的:(算法)