大数思维-乘法/除法

(整型)大数乘法

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
using namespace std;
int main()
{
	string a, b;
	int  C[256],num,p,q,t = 0,temp,k;
	//num 进数    p  q 暂时存放用来相乘的数(也就是某个位上的数) t,k k是存放结果的下标
	//t是存放结果下标的起始位置  为了符合乘法  需要将 t递增(每次一个位上的数乘完大数后)
	cin >> a >> b;
	//存放结果  先初始化为0
	memset(C, 0, 256);
	for (int i = a.size() - 1; i >= 0; --i) 
	{
		if (a[i] == '-' || a[i] == '+') 
		{
			break;  //如果a[i] 已经是 '-'或者 '+'则不必计算
		}
		p = a[i] - '0';  //存放位上的数据
		num = 0; //初始化进数为 0
		k = t; //初始化起始位置
		for (int j = b.size() - 1; j >= 0; --j) 
		{
			if (b[j] == '-' || b[j] == '+') 
			{
				break;
			}
			q = b[j] - '0';
			temp = p * q + num + C[k];  //乘积+进数+本位上原来的数
			C[k] = temp % 10;  //对数取模才是 留在该位的数
			num = temp / 10;  //进数
			++k;
		}
		C[k] = num;  //将剩余的数 存放在下一位
		++t;
	}
	if ((a[0] == '-'&& b[0] != '-')||(a[0] != '-' && b[0] == '-')) 
	{
		printf("-");
	}
	
	for (int i = k; i >= 0; --i)   //排除掉前导 0
	{
		if (C[i] != 0 || i == 0) 
		{
			k = i;
			break;
		}
		
	}
	//输出结果
	for (int i = k; i >= 0; --i) 
	{
		printf("%d", C[i]);

	}

	
	return 0;
}

大数除法(1) 高精度除以低精度

#include<string>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
	string a;
	int Sum[256], b,x = 0;    //Sum 存放结果  b 低精度的除数 x是余数 
	memset(Sum, 0, 256); // 初始化为0
	cin >> a >> b;
	
	//除法  每个位上的数都对除数相除
	for (int i = 0; i < a.size(); ++i) 
	{
		Sum[i] = (x * 10 + (a[i] - '0')) / b;//余数乘以10加上本位的数除以b
		x = (x * 10 + (a[i] - '0')) % b; // 余数
	}
	int lena = 0;
	//去除前导0
	while (Sum[lena] == 0 && lena < a.size()-1) 
	{
		++lena;

	}
	//输出商  与 余数
	cout << "商:";
	for (int i = lena; i < a.size(); ++i) 
	{
		printf("%d",Sum[i]);
	}
	cout << " 余:";
	printf("%d", x);
	return 0;
}

大数除法 高精度除以高精度

高精除以低精度是对被除数的每一位(这里
的“一位”包含前面的余数,以下都是如此)
都除以除数,而高精除以高精则是用减法模拟
除法,对被除数的每一位都减去除数,一直减到当前位置的数字(包含前面的余数)
小于除数(由于每一位的数字小于10,所以

对于每一位最多进行10次计算)具体实现程序如下:


#include<iostream>
#include<string>
using namespace std;
int a[101], b[101], c[101], d, i;

//输入大数
void inString(int a[]) 
{
	string s;
	cin >> s;
	a[0] = s.size();  //存储位数大小
	for (i = 1; i <= a[0]; i++)   //倒序存数
	{
		a[i] = s[a[0] - i] - '0';   
	}

}
void print(int a[])   //数据打印
{
	if (a[0] == 0) { cout << 0 << endl; return; }//位数w为0 则输出0  
	for (int i = a[0]; i > 0; i--) cout << a[i];  //不为0  则慢慢输出数据
	cout << endl;
	return;
}
int compare(int a[], int b[])  //比较两个数
{
	int i;
	//首先看位数  位数大的大  相同的话  一位位比下去
	if (a[0] > b[0]) return 1;
	if (a[0] < b[0])  return -1;
	for ( i = a[0]; i > 0; i--) 
	{
		if (a[i] > b[i]) return 1;
		if (a[i] < b[i]) return -1;
	}
	return 0;
}
void numpcpy(int p[], int q[], int det)  //复制p数组到q数组从det开始的地方 
{
	//是用于除法在进行减法时进行整体的移位处理
	for (int i = 1; i <= p[0]; i++) { q[i + det - 1] = p[i]; }
	//改变数组的位数
	q[0] = p[0] + det - 1;   
}
void  jian(int a[], int b[]) 
{
	int flag, i;
	flag = compare(a, b);  //比较谁大
	if (flag == 0) { a[0] = 0; return; } //表明a是减完了
	if (flag == 1)  //a比b大   可以进行减法
	{
		for (i = 1; i <= a[0]; ++i) 
		{
			if (a[i] < b[i]) { --a[i + 1]; a[i] += 10; }
			a[i] -= b[i];
		}
		while (a[0] > 0 && a[a[0]] == 0) a[0]--;  //修正a的位数  如果他的最高项是0的
	}
}
void chugao(int a[], int b[], int c[]) 
{
	int temp[101];
	c[0] = a[0] - b[0] + 1; //这是用来判断   a与b相差了多少位  然后移动b的位数 从高位减起  记住  高位是在后面的
	for (int i = c[0]; i > 0; i--) 
	{
		memset(temp, 0, 101);
		numpcpy(b, temp, i);  //对数组进行移位
		while (compare(a, temp) >= 0) 
		{
			//a大于temp  所以可以减 所以可以递增一次商
			c[i]++;
			jian(a, temp);
		}
		
	}
	while (c[0] > 0 && c[c[0]] == 0)c[0]--;//删除前导的0
	return;
}


int main()
{
	memset(a, 0, sizeof(a));
	memset(b, 0, sizeof(b));
	memset(c, 0, sizeof(c));
	inString(a), inString(b);
	chugao(a, b, c);
	print(c);
	print(a);




	return 0;
}
发布了30 篇原创文章 · 获赞 6 · 访问量 7970

猜你喜欢

转载自blog.csdn.net/weixin_42792088/article/details/87443224
今日推荐