#8348: 大數乘法


zxc818999 (格子城市)

學校 : 中華大學
編號 : 34930
來源 : [1.34.179.239]
最後登入時間 :
2013-11-02 20:44:43
a021. 大數運算 | From: [1.34.179.239] | 發表日期 : 2013-11-02 21:04

有沒有更好的乘法演算法 ?

我有查一下  ...FFT 真心看不懂 ~"~

總覺得我寫的效能很低

 

struct BigNumber

{

    int array[size+size] = {0};  // 一個欄位存一個數字 為了把答案放進陣列 所以 size * 2  

    int length;                  // 位數   

    //bool sign;                 // 正負號

}; 

 

// 進位 

void carry(BigNumber *a)

{

int i=0;

while(a->array[i] || i<=a->length)

{

   if(a->array[i] > 9) 

{

       a->array[i+1] += a->array[i]/10 ;

       a->array[i] %= 10; 

   }

   i++;

}

a->length = i;

 

// 大數乘法

BigNumber mul(BigNumber a, BigNumber b)

{

BigNumber c;

int k;

c.length = max(a.length,b.length) ;

    for (int i = 0; i < a.length; ++i)

    {

        k = i;

        for (int j = 0; j < b.length; ++j)

            c.array[k++] += a.array[i] * b.array[j];

    }

    carry(&c);

return c;

 
#8349: Re:大數乘法


zxc818999 (格子城市)

學校 : 中華大學
編號 : 34930
來源 : [1.34.179.239]
最後登入時間 :
2013-11-02 20:44:43
a021. 大數運算 | From: [1.34.179.239] | 發表日期 : 2013-11-02 21:06

有沒有更好的乘法演算法 ?

我有查一下  ...FFT 真心看不懂 ~"~

總覺得我寫的效能很低

 

struct BigNumber

{

    int array[size+size] = {0};  // 一個欄位存一個數字 為了把答案放進陣列 所以 size * 2  

    int length;                  // 位數   

    //bool sign;                 // 正負號

}; 

 

// 進位 

void carry(BigNumber *a)

{

int i=0;

while(a->array[i] || i<=a->length)

{

   if(a->array[i] > 9) 

{

       a->array[i+1] += a->array[i]/10 ;

       a->array[i] %= 10; 

   }

   i++;

}

a->length = i;

 

// 大數乘法

BigNumber mul(BigNumber a, BigNumber b)

{

BigNumber c;

int k;

c.length = max(a.length,b.length) ;

    for (int i = 0; i < a.length; ++i)

    {

        k = i;

        for (int j = 0; j < b.length; ++j)

            c.array[k++] += a.array[i] * b.array[j];

    }

    carry(&c);

return c;

對了 我大數是用倒著存的 因為進位問題這樣比較方便 ..

 
ZeroJudge Forum