20191031 专题:高精度

mac2024-08-20  62

高精度加法:

#include<bits/stdc++.h> using namespace std; const int A=300; int n,m; char a[A],b[A]; int s1[A],s2[A]; int r[A]; signed main(){ scanf("%s%s",a,b); n=strlen(a),m=strlen(b); for(int i=1;i<=n;i++) s1[i]=a[n-i]-'0'; for(int i=1;i<=m;i++) s2[i]=b[m-i]-'0'; n=max(n,m); int jw=0; for(int i=1;i<=n;i++){ jw=s1[i]+s2[i]+jw; r[i]=jw%10; jw/=10; } if(jw) r[++n]=jw; while(n>1&&!r[n]) n--; for(int i=n;i>0;i--) printf("%d",r[i]); return 0; }

高精度减法:

#include<bits./stdc++.h> using namespace std; const int A=500; int n,m; string x,y; int a[A],b[A]; int r[A]; signed main(){ cin>>x>>y; n=x.size(),m=y.size(); if(n<m){ printf("-"); swap(x,y); swap(n,m); } if(n==m) if(x<y){ printf("-"); swap(x,y); } for(int i=1;i<=n;i++) a[i]=x[n-i]-'0'; for(int i=1;i<=m;i++) b[i]=y[m-i]-'0'; int c=0; for(int i=1;i<=n;i++){ if(a[i]>=b[i]+c){ r[i]=a[i]-b[i]-c; c=0; } else{ r[i]=10+a[i]-b[i]-c; c=1; } } while(!r[n]&&n>1) n--; for(int i=n;i>0;i--) printf("%d",r[i]); return 0; }

高精度乘法:

#include<bits/stdc++.h> using namespace std; const int A=1e3; string x,y; int n,m; int a[A],b[A]; int r[A]; signed main(){ cin>>x>>y; n=x.size(),m=y.size(); for(int i=1;i<=n;i++) a[i]=x[n-i]-'0'; for(int i=1;i<=m;i++) b[i]=y[m-i]-'0'; int jw=0; for(int i=1;i<=n;i++){ jw=0; for(int j=1;j<=m;j++){ jw=a[i]*b[j]+r[i+j-1]+jw; r[i+j-1]=jw%10; jw/=10; } if(jw) r[i+m]=jw; } int w=n+m; while(!r[w]&&w>1) w--; for(int i=w;i>0;i--) printf("%d",r[i]); return 0; }

高精除单精

#include<bits/stdc++.h> using namespace std; const int A=500; string x; int n; int a[A]; int r[A]; int c; signed main(){ cin>>x; scanf("%d",&c); n=x.size(); for(int i=1;i<=n;i++) a[i]=x[i-1]-'0'; int jw=0; for(int i=1;i<=n;i++){ jw=jw*10+a[i]; r[i]=jw/c; jw=jw%c; } int tot=1; while(tot<n&&!r[tot]) tot++; for(int i=tot;i<=n;i++) printf("%d",r[i]); printf("\n"); printf("%d",jw); return 0; }

高精除高精

(模拟即可) 采用计算机做高精度除法时,模拟日常除法的步骤。但计算机不可能做“试商”,这时,我们可以采用减法来模拟。

"试商"的算法的步骤如下: 1、将除数移动和被除数对齐,位数不够时,补0, 2、利用被除数减去除数,一直减到被除数小于除数,减的次数,就是“试商”的结果,每移动一次。 3、重复上述步骤,一直到被除数和除数的位数相等为止。

代码:

#include<bits/stdc++.h> using namespace std; const int A=500; string x,y; int n,m; int a[A],b[A]; int q[A],r[A],cs=0/*减的次数*/,wq=0/*q的位数*/; int res[A]; bool compare(){ if(wq>m) return true; if(wq<m) return false; for(int i=m;i>0;i--){ if(q[i]>b[i]) return true; if(q[i]<b[i]) return false; } return true; } int sc(int wz){ cs=0,wq=0; for(int i=wz;i>0;i--){ q[wz-i+1]=a[i]; if(a[i]) wq=wz-i+1; } while(compare()){ int jw=0; for(int i=1;i<=wq;i++){ if(q[i]>=b[i]+jw){ r[i]=q[i]-b[i]-jw; jw=0; continue; } if(q[i]<b[i]+jw){ r[i]=q[i]+10-b[i]-jw; jw=1; continue; } } cs++; int sw=0;//剩余位数 for(int i=1;i<=wq;i++){ q[i]=r[i]; if(q[i]) sw=i; } wq=sw; } for(int i=wz;i>0;i--) a[i]=q[wz-i+1]; } signed main(){ cin>>x>>y; n=x.size(),m=y.size(); for(int i=1;i<=n;i++) a[i]=x[i-1]-'0'; for(int i=1;i<=m;i++) b[i]=y[m-i]-'0'; if(n<m){ printf("0\n"); for(int i=1;i<=n;i++) printf("%d",a[i]); return 0; } for(int i=m;i<=n;i++){ sc(i);//试除 res[i]=cs; } int tot1=0; while(!res[tot1]&&tot1<n) tot1++;//去商的前导零 int tot2=0; while(!a[tot2]&&tot2<n) tot2++;//去余数的前导零 for(int i=tot1;i<=n;i++) printf("%d",res[i]); printf("\n"); for(int i=tot2;i<=n;i++) printf("%d",a[i]); return 0; }
最新回复(0)