如果我們用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;
}
測試: