高精度模板合集与优化(无注释版)
我把所有的高精度模板总结了一下,收录在这里,希望对大家有帮助。
目录
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;
}