大整數乘法的詳解

2021-10-10 23:13:57 字數 2983 閱讀 1896

由於程式語言提供的基本數值資料型別表示的數值範圍有限,不能滿足較大規模的高精度數值計算,因此需要利用其他方法實現高精度數值的計算,於是產生了大數運算。尤其是乘法運算,下面就是大整數的乘法的過程(加 減法都一樣的原理)。

乘法規律,乙個數的第i位和另乙個數的第j位相乘,一定會累加到結果的第i+j位,結果的陣列乙個陣列元素存2位數,最後對結果整除得到進製,mod得到餘數就是i+j位的數字,最後列印出來。

對於大整數比較方便的輸入方法是,①按字元型處理,儲存在字串陣列s1、s2中,計算結果儲存在整型陣列ans中。 ②通過字元的ascii碼,數字字元可以直接參與運算,i位數字與j位數字相乘的表示式為:(s1[i]-『0』)*(s2[j]-『0』)。 ③每一次數字相乘的結果位數是不固定的,而結果陣列中每個元素只儲存一位數字,所以用變數t暫存結果,對t mod運算得到的就是ans[i+j]的值,若超過1位數則進製,用變數b儲存。

這種做法的時間複雜度為o(n^2)

c語言原始碼:

#include #include #include #include int max(int a,int b)

int main()

len = i+j-1 //最終的位數

}for( i = len; i >= 0; -- i) //倒置輸出

printf("%d", ans[i]);

printf("\n");

} return 0;

}

分治演算法解題的一般步驟:

現在有兩個大整數x,y;   設x, y是n位十進位制整數,分段表示如下:

即 x=a*10^(n/2)+b,   y=c*10^(n/2)+d  則:

本來可以直接算ad+bc,但是這樣效率變低了,所以對ad+bc進行分解優化後得:

計算成本:3次n/2位乘法,6次不超過n位加減法,2次移位,所有加法和移位共計o(n)次運算。由此可得

理想狀態下c語言**:(不超過long long 型,後面做法會用字串接收大整數

#include #include #include #include #define sign(x) ((x>0)?1:-1)

//_int64等同於long long

//%i64d等同於%lld

_int64 mutipy(_int64 a,_int64 b,int num)

else

} int main()

c=mutipy(a,b,len1);

printf("%i64d\n",c);

} return 0;

}

其實上述有個缺陷:那就是只能是long long 型別的大整數相乘,超出了long long 型就會報錯。解決方法看下面的做法

我們還是假設有兩個大整數x、y,它們的位數不相同,現在要求x*y的乘法,我們採用分治的演算法,將x、y分別拆分為a與b、c與d,如下圖:

上式一共需要進行2次xn0的乘法(ac、ad各一次)、2次yn0的乘法(ac、bc各一次)和3次加法,因而該演算法的時間複雜度為

跟上面一樣,對ad+bc進行分解優化得:

修改後的時間複雜度:

由於t(min(m,n))非理想狀態下的c語言**:(不超過long long 型,後面做法會用字串接收大整數

#include #include #include #include #define sign(x) ((x>0)?1:-1)

//_int64等同於long long

//%i64d等同於%lld

_int64 mutipy(_int64 a,int numa,_int64 b,int numb)

else

}int main()

temp=b;

while(temp)

c=mutipy(a,len1,b,len2);

printf("%i64d\n",c);

} return 0;

}

非理想狀態下的c語言**:(任意位數相乘,可以超出longlong型別)

#include#includeint result[255];

void cal( char a,int numa,char b,int numb,int s)

else

}else

break;

}for(j=i;j>=0;j--) //從非零的位置列印

printf("%d",result[j]);

printf("\n");

} return 0;

}

大整數乘法

參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...

大整數乘法

問題描述 by 計算機演算法設計與分析 王曉東 p17 通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況...

大整數乘法。

include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...