1. 程式人生 > 實用技巧 >高精度乘法-C++模板-實現-詳細

高精度乘法-C++模板-實現-詳細

有興趣的可以參考一下:高精度加減法

乘法

貌似高精度乘法看起來很簡單。。。

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]);
}
乘法就這樣結束了,有意見歡迎在評論區提出。