高精度乘法(高×高)

news/2025/2/5 14:58:55/

高精度乘法(高×高)

前言

ACWing算法基础课讲解了高×低的乘法,这里高×高作为一个进一步的补充,也是对闫总的板子做一个补充。

以下内容改编自《洛谷深入浅出》123页,我对代码进行了一点修改。

A*B Problem P1303

题目描述

给出两个非负整数,求它们的乘积。

提示

每个非负整数的位数不超过2000。

讲解

模拟乘法:

第6位第5位第4位第3位第2位第1位
a514
b495
a*b [1]25520
a*b [2]45936
a*b [3]20416
中间产物2049504120
处理进位254430
结果254430

仔细观察,可以发现 a[i]*b[j] 的贡献全部在中间产物的第 i+j-1 位上。这个性质提供了一个简便的写法:可以把所有贡献算出来,最后一口气处理所有进位问题。这样可以避免处理多次进位事件,优化效率——计算机中取模的效率远低于加法和乘法。

这个进位模拟过程与加法过程大同小异,都是把个位数留下,把个位以外的数字贡献给下一位,具体可见如下代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;const int N = 1e5;
const int M = 1e8;LL A[N]={0}, B[N]={0}, C[M]={0}; // 下标从1开始 
LL lena, lenb, len;void mul() {	for (LL i = 1; i <= lena; i++)for (LL j = 1; j <= lenb; j++)C[i + j - 1] += A[i] * B[j]; // 计算贡献 for (LL i = 1; i <= len; i++) { // 进位 C[i + 1] += C[i] / 10;C[i] %= 10;}while (len > 1 && !C[len]) len--; // 去掉前导零
}int main() {string a, b;cin >> a >> b;lena = a.size();lenb = b.size();len = lena + lenb; // 乘积的位数不超过两数的位数之和for (LL i = 1; i <= lena; i++) A[i] = a[lena - i] - '0';for (LL i = 1; i <= lenb; i++) B[i] = b[lenb - i] - '0';mul(); for (LL i = len; i >= 1; i--) printf("%d", C[i]);return 0;
}

http://www.ppmy.cn/news/1569535.html

相关文章

Python在线编辑器

from flask import Flask, render_template, request, jsonify import sys from io import StringIO import contextlib import subprocess import importlib import threading import time import ast import reapp Flask(__name__)RESTRICTED_PACKAGES {tkinter: 抱歉&…

「AI学习笔记」深度学习的起源与发展:从神经网络到大数据(二)

深度学习&#xff08;DL&#xff09;是现代人工智能&#xff08;AI&#xff09;的核心之一&#xff0c;但它并不是一夜之间出现的技术。从最初的理论提出到如今的广泛应用&#xff0c;深度学习经历了几乎一个世纪的不断探索与发展。今天&#xff0c;我们一起回顾深度学习的历史…

Redis基础篇(万丈高楼平地起):核心底层数据结构

大家好&#xff0c;我是小龙。近期有很多小伙伴私信我Redis怎么做持久化&#xff1f;集群方案怎么做&#xff1f;分布式锁怎么实现&#xff1f;可是我发现&#xff0c;每次简答完一个问题他还有其他类似问题&#xff0c;或则各个知识点不能串通形成体系&#xff0c;导致很多问题…

windows蓝牙驱动开发-生成和发送蓝牙请求块 (BRB)

以下过程概述了配置文件驱动程序生成和发送蓝牙请求块 (BRB) 应遵循的一般流程。 BRB 是描述要执行的蓝牙操作的数据块。 生成和发送 BRB 分配 IRP。 分配BRB&#xff0c;请调用蓝牙驱动程序堆栈导出以供配置文件驱动程序使用的 BthAllocateBrb 函数。&#xff1b;初始化 BRB…

网络原理一> ip协议相关特性

目录 概述&#xff1a;IP协议结构属性理解&#xff1a;4位版本&#xff1a;4位部首长度&#xff1a;8位服务类型&#xff1a;16位总长度字节数&#xff1a;8位生存时间&#xff1a;8位协议&#xff1a;16位部首检验和&#xff1a;32位源IP地址和32位目的IP地址&#xff1a; IP地…

蓝桥杯嵌入式uart,iic,adc_scan模版

本次用到的是ttl电平 1.波特率配置 2.中断使能 为什么会乱码 //uartmy_main.h #include "my_main.h" uint8_t led_sta0x10; char text[30]; char uart_tx[50]; char uart_rx[50];extern struct Bkeys bkey[]; char passwd[3]{1,2,3}; void LED_Disp(uint8_t dsLED)…

redis教程

Redis 教程 Redis 是一个开源的内存数据结构存储系统&#xff0c;用作数据库、缓存和消息代理。以下是一些基础知识和常用操作。 一、简介 Redis 支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等。它具有高性能、高可用性和数据持久化的特性。 二、安…

ros 创建Node

1、使用catkin_create_pkg创建一个软件包 catkin_create_pkg ssr_pkg roscpp rospy std_msgs 2、在软件包的src文件夹下创建一个节点的cpp源码文件 3、在CMakeLists.txt中设置节点源码的编译规则 4.编译运行 编译&#xff1a;shiftctrlB 运行&#xff1a; rosrun ssr_pkg …