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;
}
相关推荐
~无忧花开~2 分钟前
React状态管理完全指南
开发语言·前端·javascript·react.js·前端框架
WolfGang00732120 分钟前
代码随想录算法训练营 Day17 | 二叉树 part07
算法
温九味闻醉21 分钟前
关于腾讯广告算法大赛2025项目分析1 - dataset.py
人工智能·算法·机器学习
炽烈小老头28 分钟前
【 每天学习一点算法 2026/03/23】数组中的第K个最大元素
学习·算法·排序算法
m0_4886333230 分钟前
C语言中枚举类型变量的定义、赋值及使用方法全解析
c语言·枚举类型·实例分析·变量定义·赋值使用
老鱼说AI37 分钟前
大规模并发处理器程序设计(PMPP)讲解(CUDA架构):第四期:计算架构与调度
c语言·深度学习·算法·架构·cuda
月落归舟40 分钟前
帮你从算法的角度来认识数组------( 二 )
数据结构·算法·数组
阿贵---1 小时前
C++中的RAII技术深入
开发语言·c++·算法
Traced back1 小时前
怎么用 Modbus 让两个设备互相通信**,包含硬件接线、协议原理、读写步骤,以及 C# 实操示例。
开发语言·c#
NAGNIP1 小时前
面试官:深度学习中经典的优化算法都有哪些?
算法