C語實現格子乘法--大整數乘法
阿新 • • 發佈:2018-12-19
之前看過有博主發過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~~~