高精度四則運算
阿新 • • 發佈:2020-08-18
高精度加法
利用字串儲存資料 然後程式碼實現加法邏輯
上程式碼
#include <iostream> #include<cstdio> #include<vector> #include<queue> #include<stack> #include<cstring> using namespace std; char a1[5050],b1[5050]; int a[5050],b[5050],c[5050]; int lena,lenb,lenc; int x; //高精度最好封裝成函式 void add(){ while(lenc<lena || lenc<lenb){ c[lenc]=a[lenc]+b[lenc]+x; x=c[lenc]/10; //x為進位 c[lenc]%=10; lenc++; } c[lenc]=x;//加法可能會進位 如5+5=10 高了一位需要處理 if(c[lenc]==0){ lenc--; //說明沒進位 減回來 } for(int i=lenc;i>=0;i--){ printf("%d",c[i]); } } int main(){ //gets(a1); 洛谷這題用gets不行 害我以為自己做錯了 檢查程式碼了半天 cin >> a1; //gets(b1); cin >> b1; lena=strlen(a1); lenb=strlen(b1); for(int i=0;i<lena;i++){ a[i]=a1[lena-1-i]-'0'; } for(int i=0;i<lenb;i++){ b[i]=b1[lenb-1-i]-'0'; } add(); return 0; } // freopen("testdata.in", "r", stdin);
高精度減法
例題 洛谷P2142
高精度減法相較於加法會複雜一點 因為會出現負數情況 需要進行特殊處理
程式碼如下
#include <iostream> #include<cstdio> #include<vector> #include<queue> #include<stack> #include<cstring> using namespace std; int a[15050],b[15050],c[15050]; char a1[15050],b1[15050],temp[15050]; int lena,lenb,lenc; int fun(){ if(strlen(a1)>strlen(b1)){ return 1; } else if(strlen(b1)>strlen(a1)){ return 0; } else if(strcmp(a1,b1)>=0){ return 1; }; return 1; } void jian(){ while(lenc<lena || lenc<lenb){ if(a[lenc]-b[lenc]<0){ a[lenc+1]--;//如果不夠就借位 高位-1 a[lenc]+=10; } c[lenc]=a[lenc]-b[lenc]; lenc++; } while(c[lenc]==0&&lenc>0){//處理無效0 如101-100=001 lenc--; } for(int i=lenc;i>=0;i--){ printf("%d",c[i]); } } int main(){ cin >> a1; cin >> b1; if(!fun()){//判斷a1和b1的大小 如果b1比a1大 就交換同時直接輸出負號 printf("-"); strcpy(temp,a1); strcpy(a1,b1); strcpy(b1,temp); } lena=strlen(a1); lenb=strlen(b1); for(int i=0;i<lena;i++){ a[lena-i-1]=a1[i]-'0'; } for(int i=0;i<lenb;i++){ b[lenb-i-1]=b1[i]-'0'; } jian(); return 0; } // freopen("testdata.in", "r", stdin);
高精度乘法
洛谷P1303
高精度乘法其實最主要在於如何去實現乘法的邏輯
程式碼:
#include <iostream> #include<cstdio> #include<vector> #include<queue> #include<stack> #include<cstring> using namespace std; char a1[10005],b1[10005]; int a[10005],b[10005],c[10005]; int lena,lenb,lenc; void mul(){ for(int i=1;i<=lenb;i++) for(int j=1;j<=lena;j++) c[i+j-1]+=a[j]*b[i];//乘法運算的本質實現就是一個二重迴圈 然後計算完以後統一進位 for(int i=1;i<lena+lenb;i++) if(c[i]>9) { //進位處理 c[i+1]+=c[i]/10; c[i]%=10; } lenc=lena+lenb; while(c[lenc]==0&&lenc>1)lenc--;//處理無效0 0x10=000 for(int i=lenc;i>=1;i--)cout<<c[i]; } int main(){ cin >>a1>>b1; lena=strlen(a1);lenb=strlen(b1); for(int i=1;i<=lena;i++)a[i]=a1[lena-i]-'0'; for(int i=1;i<=lenb;i++)b[i]=b1[lenb-i]-'0'; mul(); return 0; } // freopen("testdata.in", "r", stdin);
高精度除法
簡單一點的是高精度除法除以低精度資料
程式碼
#include <iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
char a1[10005],c1[10005];
int a[10005],c[10005];
int lena,lenc,b,x,s;
void fun(){
for(int i=0;i<lena;i++){
c[i]=(x*10+a[i])/b;
x=(x*10+a[i])%b;
if(c[i]!=0){
s++;
}
if(s==0) continue;//避免第一位除不夠 出0的情況
c[lenc++]=c[i];
}
for(int i=0;i<lenc;i++) printf("%d",c[i]);
}
int main(){
cin >> a1;
cin >> b;
lena=strlen(a1);
for(int i=0;i<lena;i++){
a[i]=a1[i]-'0';
}
fun();
return 0;
}
// freopen("testdata.in", "r", stdin);