C语实现格子乘法--大整数乘法

之前看过有博主发过python版的,看了一看觉得这个方法好玩,小时候老师提过,但又总听不懂,现在就想试试看能不能实现起来。

博客链接: https://blog.csdn.net/djd1234567/article/details/45649399

具体的这篇博客也写的很清楚了,在这就具体说一说我这个算法的思路好了。

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~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值