1. 程式人生 > >C語實現格子乘法--大整數乘法

C語實現格子乘法--大整數乘法

之前看過有博主發過python版的,看了一看覺得這個方法好玩,小時候老師教的時候又總聽不懂,就想試試看能不能實現起來。

具體的這篇部落格也寫的很清楚了,在這就具體說一說我這個演算法的思路好了。

1.讓使用者輸入兩個大整數以及它們的長度。

2.建立一個二維陣列用來存放格子矩陣,建立一個一維陣列用來存放對角線元素之和,也就是最後結果。

3.還需要求取數字長度的函式,規定迴圈邊界。

4.我在求取對角線之和時,採用從右下角到左上角的方法,所以就需要一個逆序輸出的函式實現輸出。

接下來上程式碼:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>


int length(int num)//輸出數值的位數
{
	int i = 0;
	while (num)
	{
		num /= 10;
		i++;
	}
	return i;
}

void Multiplication(int a, int b, int an, int bn)  //格子乘法
{
	int n = 0; int i = an - 1;
	int arr[10][5] = { 0 }; //用來存放每一位相乘的結果
	int num[20] = { 0 };//用來儲存對角線的和

	while (a)		//建立格子矩陣
	{
		int c = a % 10 * b;
		int lc = length(c);
		for (int j = lc - 1; j >= 0; j--)
		{
			arr[i][j] = c % 10;
			c /= 10;
		}
		i--;
		a /= 10;
	}

	printf("格子矩陣為:\n");
	for (int i = 0; i < an; i++)		//輸出格子矩陣
	{
		for (int j = 0; j <= bn; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	printf("\n");

	for (int i = an - 1, j = bn - 1; i >= 0; i--) //最右邊一列為起點求對角線元素和
	{
		while (i < an)
		{
			num[n] += arr[i][j];
			i++; n++;
		}
	}
	for (int i = 0, j = bn - 1; j >= 0; j--)//最上邊一行為起點求對角線元素和
	{
		while (i < an)
		{
			num[n] += arr[i][j];
			i++; n++;
		}
	}

	for (int i = 0, j = n; i>j; i++, j--)//倒序陣列
	{
		int Tmp = num[i];
		num[i] = num[j];
		num[j] = Tmp;
	}

	printf("計算結果是:\n");
	for (int i = 0; i < n; i++)
	{
		printf("%d", num[i]);
	}
	printf("\n");
}

主函式:

int main()
{
	//int a = 58778853425466; int b = 247375829759213;
	int a = 0, b = 0, an = 0, bn = 0;
	printf("輸入較長的一個乘數及它的長度,用空格分開:\n");
	scanf("%d %d", &a, &an);
	printf("輸入另一個乘數:\n");
	scanf("%d %d", &b, &bn);
	Multiplication(a, b, an, bn);

	system("pause");
	return 0;
}

今日份兒的練習!bingo~~~