目录
前言
本文章为高精度算法全套(加,减,乘,除,全网最详细)笔记,如果喜欢视频或本文章看不懂的朋友可以直接去看了。单纯的高精度其实有模板可循,只是当高精度为题目的一部分时,难度便陡然增大,文章末尾便会推荐几个高精度进阶题目。
高精度加法
模板
for(int i=1 ; i<=lc ; i++){
c[i] += a[i] + b[i]; //lc为相加数最大的位数,c数组初始为0
c[i+1]+=c[i]/10; //a,b数组倒序存储数
c[i]%=10;
}
#include<bits/stdc++.h>
using namespace std;
string x,y;
int a[5005],b[5005],c[5005]={0},la,lb,lc;//a,b数组储存相加的俩数,c数组存储加后的数
int main(){
cin>>x>>y;
la = x.length(); lb = y.length();//分别求a,b数组的位数
lc = la > lb ? la : lb;
for(int i=0 ; i<la ; i++){
a[la - i] = x[i] - '0'; //倒叙存储
}
for(int i=0 ; i<lb ; i++){
b[lb - i] = y[i] - '0';
}
for(int i=1 ; i<=lc ; i++){
c[i] += a[i] + b[i];
c[i+1]+=c[i]/10;
c[i]%=10;
}
if(c[lc+1]>0) lc++; //两位数相加,加后的位数最多是相加位数最大值+1
for(int i=lc ; i>=1 ; i--){
cout<<c[i];
}
return 0;
}
高精度减法
模板
for(int i=1 ; i<=lc ; i++){
if(a[i] < b[i]){
a[i]+=10; //向前接 1
a[i+1]--;
}
c[i]=a[i]-b[i];
}
#include<bits/stdc++.h>
using namespace std;
string x,y;
int a[50005],b[50005],c[50005]={0},la,lb,lc;//和高精度加类似
int main(){
cin>>x>>y;
la = x.length(); lb = y.length();
if(la<lb||la==lb&&x<y){
swap(x,y); //a小于b时输出 - 并把a和b交换
swap(la,lb);
cout<<'-';
}
lc = la > lb ? la : lb;
for(int i=0 ; i<la ; i++){
a[la - i] = x[i] - '0'; //倒序存储
}
for(int i=0 ; i<lb ; i++){
b[lb - i] = y[i] - '0';
}
for(int i=1 ; i<=lc ; i++){
if(a[i] < b[i]){
a[i]+=10; //向前接 1
a[i+1]--;
}
c[i]=a[i]-b[i];
}
while(c[lc]==0 && lc>1) lc--; //两数相减的位数最大为相减时的最大位数
for(int i=lc ; i>=1 ; i--){ //倒序输出
cout<<c[i];
}
return 0;
}
高精度乘法
模板
洛谷 普及组试炼场 - 高精度算法_哔哩哔哩_bilibili
for(int i=1 ; i<=la ; i++){
for(int j=1 ; j<=lb ;j++){
c[i+j-1] += a[i]*b[j];
c[i+j] += c[i+j-1]/10; //如果不懂,可以点击网址
c[i+j-1] %= 10;
}
}
#include<bits/stdc++.h>
using namespace std;
string x,y;
int a[50005],b[50005],c[50005]={0},la,lb,lc; //和前面类似
int main(){
cin>>x>>y;
la = x.length(); lb = y.length();
for(int i=0 ; i<la ; i++){
a[la - i] = x[i] - '0';
}
for(int i=0 ; i<lb ; i++){
b[lb - i] = y[i] - '0'; //依旧倒序存储
}
for(int i=1 ; i<=la ; i++){
for(int j=1 ; j<=lb ;j++){
c[i+j-1] += a[i]*b[j];
c[i+j] += c[i+j-1]/10; //如果不懂,可以点击网址
c[i+j-1] %= 10;
}
}
lc = la+lb; //两数相乘,最大位数为两数位数的和
while(c[lc]==0 && lc>1) lc--; //lc最小减到1
for(int i=lc ; i>=1 ; i--){
cout<<c[i];
}
return 0;
}
高精度除法
高精对低精
模板
高精度算法全套(加,减,乘,除,全网最详细)_哔哩哔哩_bilibili
for(int i=1;i<=la;i++){
c[i] = (x*10+a[i])/b; //核心代码
x = (x*10+a[i])%b;
}
#include<bits/stdc++.h>
using namespace std;
string sa;
long long a[5010],b,c[5010],la,lc,x;
int main(){
cin>>sa>>b;
la = sa.length();
for(int i=0;i<la;i++)
a[i+1] = sa[i] - '0';
for(int i=1;i<=la;i++){
c[i] = (x*10+a[i])/b; //核心代码
x = (x*10+a[i])%b;
}
lc=1;
while(c[lc]==0&&lc<la) lc++;
for(int i=lc;i<=la;i++)
cout<<c[i];
return 0;
}
高精对高精
高精度算法全套(加,减,乘,除,全网最详细)_哔哩哔哩_bilibili
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int a[305],b[305],c[305],tmp[305];
void init(int *x){
string s;
cin>>s;
x[0] = s.length();
for(int i=0;i<x[0];i++){
x[x[0]-i] = s[i] - '0';
}
}
void numcpy(int p[],int q[],int n){
for(int i=1;i<=p[0];i++)
q[i+n-1] = p[i];
q[0] = p[0] + n - 1;
}
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 minu(int a[],int b[]){
for(int i=1;i<=a[0];i++){
if(a[i]<b[i]){
a[i+1]--;
a[i] = a[i]+10;
}
a[i] = a[i] - b[i];
}
while(a[a[0]]==0 && a[0]>0) a[0]--;
}
void print(int a[]){
if(a[0]==0){
cout<<0;
return ;
}
for(int i=a[0];i>0;i--)
cout<<a[i];
return ;
}
int main(){
init(a);
init(b);
c[0] = a[0] - b[0] + 1;
for(int i=c[0];i>=1;i--){
memset(tmp,0,sizeof(tmp));
numcpy(b,tmp,i);
while(compare(a,tmp)>=0){
c[i]++;
minu(a,tmp);
}
}
while(c[c[0]] == 0 && c[0] > 0) c[0]--;
print(c);
cout<<endl;
print(a);
return 0;
}