1. 程式人生 > >高精度 a*b的實現

高精度 a*b的實現

在fzu校賽結束之後,我反思了一下自己這兩個月的得失,感覺自己雖然投入較多,但是效率和收穫的東西太少,之前一直在刷水題來鞏固C的基礎,這個階段有喜悅有難過,但更多的是成長。
接下來的學習和主要的重心我打算放在演算法的學習和C++的學習上,雖然我可能確實技不如人,但是,為什麼要一直去關注別人是否比自己優秀呢?

高精度a*b的實現

注意點是進位的處理,有了a+b的基礎,在紙上模擬一遍a*b大概就可以寫出來了。

   123
  x123
--------
   369
  246
+123
--------
 15129     

程式碼:

#include<iostream>
#include<stdlib.h> #include<cstdio> #include<string.h> #include<string> using namespace std; int ra[1000005],rb[1000005]; int store[1000005]; int main() { int i,j; string a,b; while(cin>>a>>b) { if(a=="0" || b=="0") { printf("0\n"); continue
; } int i,j; memset(ra,0,sizeof(ra)); memset(rb,0,sizeof(rb)); memset(store,0,sizeof(store)); /* * 反轉輸入的兩個字串 * 從個位開始處理 * */ int tot=1; for(i=a.length()-1;i>=0;i--) { ra[tot++]=a[i]-'0'
; } tot--;//strlen(a) int cnt=1; for(i=b.length()-1;i>=0;i--) { rb[cnt++]=b[i]-'0'; } cnt--;//strlen(b) /* * 核心處理程式碼 * 從個位開始處理 * */ for(i=1;i<=tot;i++) { for(j=1;j<=cnt;j++) { store[i+j-1]+=ra[i]*rb[j]; //位數相乘 "+=" store[i+j]+=store[i+j-1]/10; //進位 store[i+j-1]=store[i+j-1]%10; //最終位數 } } for(i=1005;i>0;i--) { if(store[i]!=0) { for(j=i;j>=1;j--) { printf("%d",store[j]); } printf("\n"); break; } } } return 0; }

Java實現:

import java.util.*;
import java.io.*;
import java.math.*;

public class Main
{
    static Scanner cin = new Scanner(new BufferedInputStream(System.in));
    public final static int MS= 105;

    public static void main(String[] args)
    {
        BigInteger a,b;
        while(cin.hasNext())
        {
            a = cin.nextBigInteger();
            b = cin.nextBigInteger();
            System.out.println(a.multiply(b));
        }
    }
}