高精度乘法

在這裏沒有過多的解釋,最好的方式就是用幾個例子去單步執行代碼,畢竟這種算法不是隨隨便便就能想出來的。 

#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;
}

 

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