大數相乘

引入

    1.確定兩個大數的具體位數/長度(len1,len2),並且將他們各自存入數組中;

    2.創建一箇中間變量數組t1,長度爲(len1+len2)-1(可以自己隨便寫個乘法的豎式就知道了);

    3.按照豎式運算的方式,逐位相乘,而後同位相加,存入t1中;

   4.創建中間變量數組t2,初始化全爲0,長度爲len1+len2(預防第一位有進位),原因是兩數相乘結果一定是(len1+len2)或者(len1+len2-1)位;

    5.t1和t2尾部對齊,進行進位運算,具體轉化公式如下,(如果看不明白可以自己手算一個999*99)

            i:len1+len2 -> 1   (從len1+len2 到1  )

                    t1[i-1] += t2[i] //加上進位

                    t2[i] = t1[i-1]%10;//計算進位之後本位的值

                    t2[i-1] = t1[i-1]/10;//計算進位位

    6.如此之後答案已經存在,t2之中,則只需判斷t2第一位是不是0即可,若是0,則去掉0輸出結果;若不是0,則直接輸出結果即可。


題目練習

用高精度方法,求n!的精確值(n以一般整數輸入)。

輸入一個整數n(n可能很大)

輸出高精度n!

樣例輸入:10

樣例輸出:3628800


我的代碼:

#include <iostream>
#include <cstring>
#include <sstream>

using namespace std;
int len_a=1;
int* ans=new int();

void fun(int* x, int len_x)
{
    int t[len_x+len_a-1] ={0};
    int tt[len_x+len_a]={0};

    for(int i=0; i<len_x; i++)
        for(int j=0; j<len_a; j++)
            t[i+j]+=x[i]*ans[j];

    for(int i=len_a+len_x-1; i>=1; i--)
    {
        t[i-1]+=tt[i];
        tt[i]=t[i-1]%10;
        tt[i-1]=t[i-1]/10;
    }

    if(tt[0]==0)
    {
        len_a=len_x+len_a-1;
        for(int i=1;i<len_a+1;i++)
            ans[i-1]=tt[i];
    }
    else
    {
        len_a=len_x+len_a;
        for(int i=0;i<len_a;i++)
            ans[i]=tt[i];
    }
}


int main()
{
    int n;
    cin>>n;
    ans[0]=1;
    for(int i=2;i<=n;i++)
    {
        string str_t;
        stringstream ss;
        ss<<i;
        ss>>str_t;
        int len_t=str_t.length();
        int t[len_t];
        for(int j=0; j<len_t; j++)
        {
            stringstream ss1;
            ss1<<str_t[j];
            ss1>>t[j];
        }
        fun(t,len_t);
    }
    for(int i=0; i<len_a;i++)
        cout<<ans[i];
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章