如果我们用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;
}
测试: