【算法】高精度乘法

前言

最近在参加某个比赛的时候遇到了这个问题,用字符串表示时,长度能达到15,所以针对大数乘法写一篇文章。

高精度 * 低精度

在这种场景下,一般都是给定一个无法用int或long long 存储的数,再给定一个能用int或long long存储的数,让你求他们相乘的结果。

算法思路:
1、首先,我们将无法存储的数以字符串的形式存储,定义为s ; 将能被存储的数字定义为d
2、开辟一个数组a,用来保存s的每个位上的数字
3、第一次遍历数组a,将每个数字都乘以d
4、第二次遍历数组a,进位、保留10以内的数字
4.1、 如果能被10整除,将a[i]/10 加到a[i+1]上,同时 a[i] %= 10
4.2、 不能则结束这个位置的进位

细节:
1、结果a的长度len一开始被定义为s的元素个数,但随着不断进位,如果满足4.1的条件,则说明一定进到了下一位,如果此时恰好是a的最后一个位置,则要让len++再次循环一次

2、读入字符串的时候我们是正着读取的,但是处理时要reverse逆置,方便操作;输出结果时要倒着输出。

代码

//高精度 * 低精度
void HighLow(string s, long long d) {

	vector<long long> a(N, 0);
	reverse(s.begin(), s.end());
	int len = s.size();
	for (int i = 0; i < len; i++) {
		a[i + 1] = s[i] - '0';
	}

	for (int j = 1; j <= len; j++) {
		a[j] *= d;
	}

	for (int j = 1; j <= len; j++) {
		if (a[j] >= 10) {
			a[j + 1] += a[j] / 10;
			a[j] %= 10;
			if (j == len) len++;
		}
	}

	for (int i = len; i >= 1; i--) {
		cout << a[i];
	}
	cout << endl;
}

高精度 * 高精度

在这种场景下,一般都是给定两个无法用int或long long 存储的数,让你求他们相乘的结果。

我们先来回顾一下,当我们进行乘法运算时的步骤:

在这里插入图片描述

算法思路;
1、首先将两个数字以字符串的格式存取,定义为a、b
2、遍历a、b,将他们每个位上的数字存储在A、B两个数组上
3、由上面我们对乘法公式的推导,使用双重循环遍历A、B的每一个数字即C[i+j] += A[i]*B[j];
4、再遍历C数组,和上面处理进位和保留的方式一致。

细节:
注意到结果数组C我们定义的大小是lenc = lena + lenb , 例如999 * 999 是一定小于等于6位的,但我们无法确定是否一定是六位,比如20*20只有三位,所以在最后处理结果的时候,要从后去掉0直到遇到第一个非0的数字。

参考代码

void HighHigh(string a, string b) {
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());

	int lena = a.size();
	int lenb = b.size();
	int lenc = lena + lenb;
	vector<int> A(lena+1,0), B(lenb+1,0) , C(lenc,0);
	for (int i = 0; i < lena; i++) {
		A[i] = a[i] - '0';
	}
	for (int i = 0; i < lenb; i++) {
		B[i] = b[i] - '0';
	}

	for (int i = 0; i < lena; i++) {
		for (int j = 0; j < lenb;j++) {
			C[i + j] += A[i] * B[j];
		}
	}

	for (int i = 0; i < lenc; i++) {
		if (C[i] >= 10) {
			C[i + 1] += C[i] / 10;
			C[i] %= 10;
			if (i == lenc - 1) {
				lenc++;
			}
		}
	}

	int pos = lenc - 1;
	while (C[pos] == 0) pos--;
	while (pos >= 0) {
		cout << C[pos];
		pos--;
	}
	cout << endl;

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/609453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

c++11 标准模板(STL)本地化库 - 平面类别(std::money_get) - 从输入字符序列中解析并构造货币值

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 从输入字符序列中解析并构造货币值 std::money_get template<…

(二十九)深入理解蓝牙BLE之“5.1版本新特性”

回顾5.0新特性&#xff1a; 1.增加2Mbps LE PHY&#xff1a;但是只能用于连接。 2.增加LE Long range&#xff0c;S2&#xff08;500kbps&#xff09;&#xff0c;S8&#xff08;125kbps&#xff09;&#xff1a;可以实现更远的传输距离。 3.增加High duty cycle non-connec…

轮式机器人

迄今为止,轮子一般是移动机器人学和人造交通车辆中最流行的运动机构。它可达到很高的效率, 如图所示, 而且用比较简单的机械就可实现它的制作。 另外,在轮式机器人设计中,平衡通常不是一个研究问题。 因为在所有时间里,轮式机器人一般都被设计成在任何时间里所有轮子均与地接…

「短链接教程」如何使用自己的域名生成短链接

在当今数字化时代&#xff0c;短链接的应用越来越广泛。它们不仅能让链接更简洁美观&#xff0c;还便于分享和传播。 但很多时候想用自己的域名生成短链接&#xff1f;搭建短链接平台又比较麻烦&#xff0c;所以&#xff0c;这里以C1N短网址(c1n.cn)为例&#xff0c;介绍下如何…

MySQL——利用变量进行查询操作

新建链接&#xff0c;自带world数据库&#xff0c;里面自带city表格。 DQL # MySQL利用变量进行查询操作 set cityNameHaarlemmermeer; select * from city where NamecityName;# 多个结果查询 set cityName1Haarlemmermeer; set cityName2Breda; set cityName3Willemstad; s…

重生奇迹mu烈火剑带什么技能

在重生奇迹mu游戏中&#xff0c;35级是每个职业的分水岭&#xff0c;只要到了35级&#xff0c;三职业都可以学习自己的高级技能&#xff0c;道士可以召唤自己的大狗&#xff0c;法师拥有冰咆哮&#xff0c;战士就是咱们今天要说的烈火剑法&#xff0c;这三种技能都需要玩家自己…

Numpy求最大、最小值、求累乘、累和

Numpy求最大、最小值 代码举例&#xff1a; ​ 输出结果为&#xff1a; ​ 在这个例子中&#xff0c;我们首先导入了NumPy库&#xff0c;然后创建了一个3x3的矩阵A。接着&#xff0c;我们使用np.max()函数来求矩阵A的最大值&#xff0c;并将结果存储在变量max_value中&#xff…

树莓派搭建wordpress,上传主题时显示wordpress上传的文件大小超过 php.ini 文件中定义的 upload_max_filesize 值

问题&#xff1a;wordpress上传的文件大小超过 php.ini 文件中定义的 upload_max_filesize 值 解决方案&#xff1a;进入树莓派shell界面 输入指令查找php.ini文件 find / -name ‘php.ini’ 修改php.ini文件 sudo vim /etc/php/8.1/cli/php.ini 找到 upload max filesize…

异步时序电路的分析方法

异步时序电路的分析方法 在异步时序电路中&#xff0c;只有部分触发器由时钟脉冲 CP触发&#xff0c;其它触发器由电路内部信号触发。分析异步时序电路时需写出时钟方程&#xff0c;并特别注意各触发器的时钟条件在何时满足&#xff0c;其状态方程才能使用 Tips&#xff1a;在…

OpenHarmony 实战开发——3.1 Release + Linux 原厂内核Launcher起不来问题分析报告

1、关键字 Launcher 无法启动&#xff1b;原厂内核&#xff1b;Access Token ID&#xff1b; 2、问题描述 芯片&#xff1a;rk3566&#xff1b;rk3399 内核版本&#xff1a;Linux 4.19&#xff0c;是 RK 芯片原厂发布的 rk356x 4.19 稳定版内核 OH 版本&#xff1a;OpenHa…

5G NR 吞吐量计算 and 4G LTE 吞吐量计算

5G NR Throughput References • 3GPP TS 38.306 V15.2.0 (2018-06) ➤J : number of aggregated component carriers in a band or band combination ➤Rmax : 948/1024 • For the j-th CC, Vlayers(j) is the maximum number of layers ➤Qm(j) : Maximum modulation orde…

2024数维杯B题全保姆教程 生物质和煤共热解问题的研究

B题 生物质和煤共热解问题的研究 &#xff08;1&#xff09;基于附件一&#xff0c;请分析正己烷不溶物(INS)对热解产率&#xff08;主要 考虑焦油产率、水产率、焦渣产率&#xff09;是否产生显著影响&#xff1f;并利用图像 加以解释。 根据我视频的分析&#xff0c;这里采用…

阅读送书抽奖?玩转抽奖游戏,js-tool-big-box工具库新上抽奖功能

先讨论一个问题&#xff0c;你做软件工作是为了什么&#xff1f;从高中选专业&#xff0c;就喜欢上了软件开发&#xff1f;还是当初毕业不知道干啥&#xff0c;不喜欢自己的专业&#xff0c;投入软件开发的怀抱&#xff1f;还是干着干着别的&#xff0c;突然觉得互联网行业真不…

Springboot+Vue项目-基于Java+MySQL的毕业就业信息管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

什么是趋势交易?澳福无偿分享

盈利的本质就是能低买高卖&#xff0c;那么怎么能找到交易中的高点和低点呢&#xff1f;其实很简单&#xff0c;只需要运用趋势交易就能很快的找到交易中的高点和低点。那么什么是趋势交易呢&#xff1f;澳福外汇今天详解&#xff01; 趋势交易有3种趋势&#xff0c;如果其包含…

对话NVIDIA英伟达:AI已照进现实 | 最新快讯

文 | MetaPost NVIDIA 创始人兼首席执行官黄仁勋在 GTC 2024 主题演讲上表示&#xff1a;下一波 AI 浪潮将是 AI 对物理世界的学习。 当下&#xff0c;全球范围内价值超过50万亿美金的行业正在竞相实现数字化&#xff0c;数字孪生技术正在赋能千行百业。NVIDIA Omniverse 中国…

“感恩遇到你,郭护士!”佛山市一医院 护士回家途中救了位老奶奶

“感恩遇见你&#xff0c;我感谢郭护士关爱长者、热心助人的高尚行为……”看着信件上感谢的话语&#xff0c;郭琳玲的内心感动不已。而这一封亲笔手写的感谢信&#xff0c;是来自一位将近八十岁的老奶奶。 郭琳玲是佛山市第一人民医院创伤重症功能神经外科的一名护士。4月30日…

【快讯】山东省第四批软件产业高质量发展重点项目开始申报

为加快落实《山东省高端软件“铸魂”工程实施方案&#xff08;2023-2025&#xff09;》&#xff0c;提高软件产业规模能级&#xff0c;提升关键软件技术创新和供给能力&#xff0c;塑强数字经济发展核心竞争力&#xff0c;确定开展第四批软件产业高质量发展重点项目申报工作&am…

深入探讨利用大型语言模型的力量的策略 (LLMs)

Note: 提示词工程是一门融合了艺术和科学的学科——它既是对技术的理解&#xff0c;也是对创造力和战略思维的理解。 本文为对LLMS策略分享内容学习后的整理&#xff0c;尝试抛开网上广泛讨论和记录的传统提示词工程技术&#xff0c;展示通过实验学到的新见解&#xff0c;以及…

树和二叉树的定义和基本术语

文章目录 前言一、树的定义二、树的基本术语三、二叉树的定义总结 前言 T_T此专栏用于记录数据结构及算法的&#xff08;痛苦&#xff09;学习历程&#xff0c;便于日后复习&#xff08;这种事情不要啊&#xff09;。所用教材为《数据结构 C语言版 第2版》严蔚敏。 一、树的定义…