1. 程式人生 > >關於大整數相乘

關於大整數相乘

由於int範圍有限,對於大整數相乘必定不能直接用*符號,而是用char型陣列記錄,通過模擬乘法達到大整數相乘的效果,

假定a陣列長度為A,b陣列長度為B。求出來的大整數長度有三種可能,

1.A+B(最後一位無進位),

2.A+B+1(最後一位有進位),

3.0(數a或者數b其一為0)(不要忽略這種可能,我就是忽略了這個一直WA....)

程式碼如下,

void bigmultiply_methods(char  *a, char *b, char *c) {    
	
	int A = strlen(a), B = strlen(b), add, mul, i, j,k;                          //mul記錄乘法進位,k記錄加法進位
	for (j = 0; j < B; j++) {
		mul = 0;
		k = 0;
		for (i = 0; i < A; i++) {
			if (mul&&k)   add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0') + mul+k;     //add為加上的數
			else if (!mul&&k)   add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0')+k ;
			else if (mul&&!k)  add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0') + mul;
			else add = (a[A - 1 - i] - '0')* (b[B - 1 - j] - '0'); 
			if (add > 9) {
				mul = add  / 10;
			    c[j + i] += (add  % 10);
			}
			else {
				mul = 0;
				c[j + i] += add;
			}
			if (c[j + i]>'9') {
				k = (c[j + i] - '0') / 10;
				c[j + i] = (c[j + i] - '0') % 10+'0';
			}
			else k = 0;                                                          //如果c[j+i]<='9',記得k清零,表示無加法進位了。
		}
		if (mul)  c[j + i] += mul;                                //因為迴圈出來還有最後一位沒有判斷,故要再判斷最後一位
	    if(k) c[j + i] += k;
	}
	if (c[j + i]!='0') c[j + i + 1] = '\0';
	else c[j + i] = '\0';
	//c陣列要逆序輸出
}
時間複雜度約為 O(AB).

希望大家有所收益,如果程式碼有問題或者有建議,我也希望一起交流進步呢。謝謝