高精度模板合集与优化(全)

405 阅读2分钟

高精度模板合集与优化(无注释版)

我把所有的高精度模板总结了一下,收录在这里,希望对大家有帮助。

目录

1.高精度加法
2.高精度减法
3.高精度乘法
4.高精度除法
(1)高精度除以低精度
(2)高精度除以高精度

5.高精度算法的优化思路

一、高精度加法

#include<bits/stdc++.h>
using namespace std;
#define N 10000000
int t1[N], t2[N], c[N];
char a[N], b[N];// 两个加数
int main(){
	cin>> a>> b;//输入两个加数 
	int lena = strlen(a);
	int lenb = strlen(b);
	for(int i = 0; i < lena; ++ i) t1[lena - i] = a[i] - '0';//存下两个加数 
	for(int i = 0; i < lenb; ++ i) t2[lenb - i] = b[i] - '0';
	int len = lena > lenb ? lena : lenb;
	for(int i = 1; i <= len; ++ i){//从低位到高位的处理 
		c[i] += t1[i] + t2[i];
		if(c[i] >= 10){
			c[i] %= 10;
			c[i + 1] ++;
		}
	} 
	if(c[len + 1]) len ++;//最高位的判断 
	for(int i = len; i >= 1; -- i)
		printf("%d", c[i]);
	return 0;
}

二、高精度减法

#include<bits/stdc++.h>
using namespace std;
#define N 10000000
int t1[N], t2[N], c[N];
char a[N], b[N];// 两个数
char ch[N];//中间字符串
int main(){
	cin>> a>> b;//输入数 
	int lena = strlen(a);
	int lenb = strlen(b);
	if(lena < lenb || (lena == lenb && strcmp(a, b) < 0)){
		strcpy(ch, a);
		strcpy(a, b);
		strcpy(b, ch);
		printf("-");
	}//如果前一个数小于后一个数,则交换二者 
	lena = strlen(a); 
	lenb = strlen(b);
	for(int i = 0; i < lena; ++ i) t1[lena - i] = a[i] - '0';//存下两个数 
	for(int i = 0; i < lenb; ++ i) t2[lenb - i] = b[i] - '0';
	int len = lena > lenb ? lena : lenb;
	for(int i = 1; i <= len; ++ i){//从低位到高位的处理 
		c[i] += t1[i] - t2[i];
		if(c[i] < 0){
			c[i] += 10;
			c[i + 1] --;
		}
	} 
	while(!c[len] && len > 0) len --;
	if(!len){//特殊情况的判断 
		puts("0");
		return 0;
	} 
	for(int i = len; i >= 1; -- i)
		printf("%d", c[i]);
	return 0;
}

三、高精度乘法

#include<bits/stdc++.h>
using namespace std;
#define N 10000000
int t1[N], t2[N], c[N];
char a[N], b[N];// 两个数
int main(){
	cin>> a>> b;//输入两个数 
	int lena = strlen(a);
	int lenb = strlen(b);
	for(int i = 0; i < lena; ++ i) t1[lena - i] = a[i] - '0';//存下两个加数 
	for(int i = 0; i < lenb; ++ i) t2[lenb - i] = b[i] - '0';
	int len = lena + lenb;
	for(int i = 1; i <= lena; ++ i){//两层循环依次计算 
		int x = 0;//存储进位 
		for(int j = 1; j <= lenb; ++ j){
			c[i + j - 1] += t1[i] * t2[j] + x;//
			x = c[i + j - 1] / 10;
			c[i + j - 1] %= 10;
		}
		c[i + lenb] = x;
	}
	while(!c[len] && len > 1) len --;
	for(int i = len; i >= 1; -- i)
		printf("%d", c[i]);
	return 0;
}

四、高精度除法

1.高精度除以低精度

#include<bits/stdc++.h>
using namespace std;
#define N 10000000
int t1[N], c[N];
char a[N];// 两个数
int b; 
int main(){
	cin>> a>> b;//输入两个数 
	int lena = strlen(a);
	for(int i = 0; i < lena; ++ i) t1[lena - i] = a[i] - '0';//存下被除数 
	int len = lena;
	int x = 0;
	for(int i = len; i >= 1; -- i){//从高位到低位的处理 
		c[i] += (x * 10 + t1[i]) / b;
		x = (x * 10 + t1[i]) % b;
	}
	while(!c[len] && len > 1) len --;//最高位的判断
	for(int i = len; i >= 1; -- i)
		printf("%d", c[i]);//商 
	printf(" %d", x);//余数 
	return 0;
}

2.高精度除以高精度

#include<bits/stdc++.h>
using namespace std;
#define N 305
int a[N], b[N], c[N];//anan-1'''a1->数字的正常顺序 
void Init(int a[]){//读入数据并进行存储 
	string s;
	cin>> s;
	a[0] = s.size();
	for(int i = 1; i <= a[0]; ++ i)
		a[i] = s[a[0]-i] - '0';
	return;
}
void Print(int a[]){//输出结果函数 
	if(a[0] == 0){
		cout<< '0'<< endl;
		return ;
	}
	for(int i = a[0]; i > 0; -- i)
		cout<< a[i];
	cout<< endl;
	return ;
}
int compare(int a[], int b[]){//比较两个数大小的函数 
	if(a[0] > b[0]) return 1;
	if(a[0] < b[0]) return -1;
	for(int i = a[0]; i > 0; -- i){
		if(a[i] > b[i]) return 1;
		if(a[i] < b[i]) return -1;
	}
	return 0;
}
void numcpy(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;
	return ;
}
void Minus(int a[], int b[]){//减法操作 
	int flag;
	flag = compare(a, b);
	if(!flag){
		a[0] = 0;
		return ;
	}
	if(flag){
		for(int 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] --;
	}
	return ;
}
void High_accuracy_division(int a[], int b[], int c[]){
	int tmp[N];
	c[0] = a[0] - b[0] + 1;
	for(int i = c[0]; i > 0; -- i){
		memset(tmp, 0, sizeof(tmp));
		numcpy(b, tmp, i);
		while(compare(a, tmp) >= 0){
			c[i] ++;
			Minus(a, tmp);
		}
	}
	while(c[0] > 0 && c[c[0]] == 0)
		c[0] --;
	return ;
}
int main(){
	Init(a);
	Init(b);
	High_accuracy_division(a, b, c);
	Print(c);
	Print(a);
	return 0;
}

五、高精度算法的优化思路

在这里插入图片描述