乘法如何突破位數限制

        如果我們用int或double等進行乘法運算是有位數和精確度的限制,如何突破這種限制呢?當然只能自己寫一個乘法運算。

        如果我們用筆和紙進行乘法運算是沒有位數和精確度限制的,那麼我們是否可以模擬用筆和紙做乘法運算呢?在一定範圍內是可以。首先我們可以肯定,一位數乘一位數是可以實現的,然後我們可以設置兩個char數組a[n]和b[n]來個記錄兩個n位數,無論是小數還是整數,然後設置一個int數組c[2n]來記錄結果。注意:n位數乘m位數的結果必定是在n+m位數之內。計算過程就是,a[n]和b[n]中,每兩個數的相乘,將結果放在c[2n]中的相應位置,最後進行滿10進1的計算得到結果。下面是代碼:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void)
{
	char a[1024] = { 0 };
	char b[1024] = { 0 };
	int c[2048] = { 0 };
	int an, bn;
	scanf("%s", a);
	scanf("%s", b);
	an = strlen(a);
	bn = strlen(b);
	// 捨去末尾的 0
	for (int i = an - 1; i >= 0; i--) {
		if (a[i] != '0')
			break;
		else {
			a[i] = '\0';
			an--;
		}
	}
	for (int i = bn - 1; i >= 0; i--) {
		if (b[i] != '0')
			break;
		else {
			b[i] = '\0';
			bn--;
		}
	}
	// 計算小數點的位數及捨去小數點
	int ap = 0, bp = 0;
	if (strchr(a, '.')) {
		for (char *temp = strchr(a, '.'); *temp != '\0'; temp++) {
			*temp = *(temp + 1);
			ap++;
		}
		ap--;
		an--;
	}
	if (strchr(b, '.')) {
		for (char *temp = strchr(b, '.'); *temp != '\0'; temp++) {
			*temp = *(temp + 1);
			bp++;
		}
		bp--;
		bn--;
	}
	int cp = ap + bp;
	// 乘法計算
	for (int i = 0; i < bn; i++) {
		for (int j = 0; j < an; j++) {
			int ai = an - j - 1;
			int bi = bn - i - 1;
			int cn = (a[j] - '0') * (b[i] - '0');
			int ci = ai + bi;
			div_t d = div(cn, 10);
			c[ci] += d.rem;
			c[ci + 1] += d.quot;
		}
	}
	// 滿10進1
	for (int i = 0; i < an + bn; i++) {
		div_t d = div(c[i], 10);
		c[i] = d.rem;
		c[i + 1] += d.quot;
	}
        // 輸出及插入小數點
	int start = 0;
	for (int i = an + bn - 1; i >= 0; i--) {
		if (c[i] != 0 || i == cp)    // 捨去最高位的0,至少保留小數點前一位
			start = 1;
		if (start) {
			if (i + 1 == cp) {
				printf(".");
			}
			printf("%d", c[i]);
		}
		
	}

	//system("pause");
	return 0;
}

測試:

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