高精度乘法-C++模板-實現-詳細
阿新 • • 發佈:2020-08-14
有興趣的可以參考一下:高精度加減法
乘法
貌似高精度乘法看起來很簡單。。。
co模板 快捷路徑
#include<cstdio> using namespace std; const int wei=100000; int a[100][wei],bz[100],ad[100]; void read(int i) { char ch=getchar(); bz[i]=1,ad[i]=0; int b[wei]; while (ch<'0' || ch>'9') { if (ch=='-') bz[i]=-1; ch=getchar(); } while乘法(ch>='0' && ch<='9') { b[++ad[i]]=ch-'0';ch=getchar();} for (int j=1;j<=ad[i];++j) a[i][ad[i]-j+1]=b[j]; } void mul(int i,int j,int k) { for (int l=1;l<=ad[i];++l) { for (int r=1;r<=ad[j];++r) { a[k][l+r-1]+=a[i][l]*a[j][r]; a[k][l+r]+=a[k][l+r-1]/10; a[k][l+r-1]%=10; } } ad[k]=ad[i]*ad[j]+3; while (a[k][ad[k]]==0) --ad[k]; bz[k]=bz[i]*bz[j]; return; } int main() { read(1); read(2); mul(1,2,3); if (bz[3]==-1) printf("-"); for (int i=ad[3];i>0;--i) printf("%d",a[3][i]); }
乘法主要採用模擬手動運算解決,列舉每一次相乘即可
注意一下乘之後的位數會不會爆就行了
下面程式碼中附有具體操作:
#include<cstdio>
using namespace std;
const int wei=100000; //數的位數,初始為10100000。
int a[100][wei],bz[100],ad[100]; //a為具體數字,bz為正負號,ad為位數
void read(int i) //讀入高精度數
{
char ch=getchar();
bz[i]=1,ad[i]=0;
int b[wei];
while (ch<'0' || ch>'9') { if (ch=='-') bz[i]=-1; ch=getchar(); }
while (ch>='0' && ch<='9') { b[++ad[i]]=ch-'0';ch=getchar();}
for (int j=1;j<=ad[i];++j) a[i][ad[i]-j+1]=b[j];
}
void mul(int i,int j,int k) //乘法,意為將編號i的數乘以編號j的數
{
for (int l=1;l<=ad[i];++l) //列舉i的每一位
{
for (int r=1;r<=ad[j];++r) //列舉j
{
a[k][l+r-1]+=a[i][l]*a[j][r]; //即結果的(L+R-1)位要加上乘積(列個豎式看看就知道為什麼了)
a[k][l+r]+=a[k][l+r-1]/10; //進位操作
a[k][l+r-1]%=10;
}
}
ad[k]=ad[i]*ad[j]+3; //押位操作
while (a[k][ad[k]]==0) --ad[k]; //精確一下位數
bz[k]=bz[i]*bz[j]; //符號為兩個數符號相乘
return;
}
int main()
{ //測試
read(1); //讀入編號一的數
read(2); //讀入編號二的數
mul(1,2,3); //相乘
if (bz[3]==-1) printf("-"); //判斷正負
for (int i=ad[3];i>0;--i) //輸出
printf("%d",a[3][i]);
}
乘法就這樣結束了,有意見歡迎在評論區提出。