在這裏沒有過多的解釋,最好的方式就是用幾個例子去單步執行代碼,畢竟這種算法不是隨隨便便就能想出來的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char s[10000], ss[10000];
int a[10000], b[10000], c[10000];
//int len,lenn;
/*-------------高精度乘法(高)--------------*/
void cheng_gao() //高是指高精度乘高精度
{
int len = strlen(s);
int lenn = strlen(ss);
memset(a, 0, sizeof(a)); //清零數組
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
for (int i = 0; i < len; i++)
a[len - i - 1] = s[i] - '0'; //將字符串轉化爲數組
for (int i = 0; i < lenn; i++)
b[lenn - i - 1] = ss[i] - '0';
for (int i = 0; i < len; i++)
for (int j = 0; j < lenn; j++)
c[i + j] += a[i] * b[j];
//運算(符合乘法規則,將加法豎式當中的數全部合併)
int l = len + lenn - 1; //l是結果的最高位數
/* 進位 */
for (int i = 0; i < l; i++)
{
c[i + 1] += c[i] / 10; //保證每一位的數都只有一位(個位),並進位
c[i] %= 10;
}
if (c[l] > 0) l++; //保證最高位數,確保輸出時不會忽略向最高位的進位
/*while (c[l - 1] >= 10)
{
c[l] = c[l - 1] / 10;
c[l - 1] %= 10;
l++;
}*/
while (c[l - 1] == 0 && l > 1)
l--; //while去零法,確保當輸入開頭有0在輸出的時候影響數位。
printf("結果:\n");
printf("%s × %s = ", s, ss);
for (int i = l - 1; i >= 0; i--) //輸出結果 ,數組下標從0開始
printf("%d", c[i]);
printf("\n"); //換行
}
void print() //輸出函數
{
printf("高精度乘法(高)(By STY)\n\n");
printf("請輸入兩個數字:\n");
printf("數字:(用空格隔開)\n");
}
int main()
{
print();
while (scanf("%s%s", s, ss) !=EOF )
{
printf("\n結果:\n");
cheng_gao(); //引用高精度乘法函數
printf("\n\n");
print();
}
system("pause");
return 0;
}