C语言:高精度乘法

P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

第一次画图,略显简陋。

由图可以看出c的小标与x,y下标的关系为x的下标加上y的下标再减一。

由此得到: c [ i + j - 1 ] = x [ i ] * y [ j ]x

cpp 复制代码
#include<stdio.h>
#include<string.h>
char x[2005];//存储第一个整数,转为字符串方便计数长度和位运算
char y[2005];//存储第二个整数,转为字符串方便计数长度和位运算
int a[2005];//逆序存储第一个整数,方便相同位的运算
int b[2005];//逆序存储第二个整数,方便相同位的运算
int c[4005];//逆序存储结果
int main()
{
	scanf("%s", x);
	scanf("%s", y);
	size_t la = strlen(x);//计算x的长度
	size_t lb = strlen(y);//计算y的长度
	size_t lc = la + lb;//c的最大长度为x+y
	for (int i = 0; i < la; i++)
	{
		a[la - i] = x[i] - '0';//逆序存储x
	}
	for (int i = 0; i < lb; i++)
	{
		b[lb - i] = y[i] - '0';//逆序存储y
	}
	for (int i = 1; i <= la; i++)
	{
		for (int j = 1; j <=  lb; j++)
		{
			c[i + j - 1] += a[i] * b[j];//c的第i+j-1位为a的第i位乘b的第j位
			c[i + j] += c[i + j - 1] / 10;//如果c的i+j-1位超过10,则i+j位要加上i+j-1位的十位
			c[i + j - 1] %= 10;//i+j-1位只留下个位
		}
	}
	while (c[lc] == 0&&lc>0)
	{//数字是倒序存储,所以前面可能出现0
		lc--;//去除前面可能出现的0
	}
	for (size_t i = lc; i > 0; i--)
	{
		printf("%d", c[i]);//逆序打印
	}
	if (x[0] == '0' || y[0] == '0')
	{
		printf("0");//如果有一个数是0,会被前面的去除前面的0的步骤删除,所以要单独打印
	}
	return 0;
}
相关推荐
程序员Xu21 小时前
【LeetCode热题100道笔记】二叉树的右视图
笔记·算法·leetcode
FPGAI21 小时前
Qt编程之信号与槽
开发语言·qt
Swift社区1 天前
从 JDK 1.8 切换到 JDK 21 时遇到 NoProviderFoundException 该如何解决?
java·开发语言
笑脸惹桃花1 天前
50系显卡训练深度学习YOLO等算法报错的解决方法
深度学习·算法·yolo·torch·cuda
阿维的博客日记1 天前
LeetCode 48 - 旋转图像算法详解(全网最优雅的Java算法
算法·leetcode
0wioiw01 天前
Go基础(④指针)
开发语言·后端·golang
房开民1 天前
使用海康机器人相机SDK实现基本参数配置(C语言示例)
c语言·数码相机·机器人
GEO_YScsn1 天前
Rust 的生命周期与借用检查:安全性深度保障的基石
网络·算法
程序员Xu1 天前
【LeetCode热题100道笔记】二叉搜索树中第 K 小的元素
笔记·算法·leetcode
How_doyou_do1 天前
数据传输优化-异步不阻塞处理增强首屏体验
开发语言·前端·javascript