【算法】高精度乘法

news2024/11/24 3:51:48

前言

最近在参加某个比赛的时候遇到了这个问题,用字符串表示时,长度能达到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;

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第74天:漏洞发现-Web框架中间件插件BurpSuite浏览器被动主动探针

目录 思维导图 前置知识 案例一&#xff1a;浏览器插件-辅助&资产&漏洞库-Hack-Tools&Fofa_view&Pentestkit 案例二&#xff1a; BurpSuite 插件-被动&特定扫描-Fiora&Fastjson&Shiro&Log4j 思维导图 前置知识 目标&#xff1a; 1. 用…

Linux 进程间通信之命名管道

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 命名管道 创建一个命名管道 …

八大排序详解:动图、代码、注释

目录 何为八大排序&#xff1f; 直接插入排序 排序过程解读 直接插入排序的特性总结&#xff1a; 希尔排序 希尔排序的特性总结&#xff1a; 直接选择排序 直接选择排序的特性总结&#xff1a; 堆排序 直接选择排序的特性总结&#xff1a; 冒泡排序 快速排序 1.Hoa…

全景剖析阿里云容器网络数据链路(七):Terway DataPath V2(Terway≥1.8.0)

作者&#xff1a;余凯 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的IaaS化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度&#xff0c;也一直在高速的发展和演…

【JavaEE网络】网络编程及其应用概述

目录 面向字节流粘包问题 TCP异常情况TCP/UDP对比 网络层重点协议IP协议IP地址 面向字节流 粘包问题 在面向字节流的情况下&#xff0c;会产生一些其他的问题&#xff1a;粘包问题&#xff0c;这里“粘”的是“应用层数据报”&#xff0c;通过TCP read/write的数据&#xff0…

jvm 马士兵 01

01.JVM是什么 JVM是一个跨平台的标准 JVM只识别class文件&#xff0c;符合JVM规范的class文件都可以被识别

javaScript 判断闰年

接受用户输入年份 如果是闰年就弹出闰年&#xff0c;遇到平年就是弹出平年 var a prompt(请输入年份);if(a%40&&a%100!0||a%4000){alert(闰年);}else{alert(平年);}

智慧校园为师生带来的那些帮助

随着互联网技术的发展&#xff0c;学校高度重视校园信息化建设&#xff0c;越来越多的学校开始建设智能校园。智慧校园是以智慧校园建设为基础&#xff0c;为学生的校园生活和学校的日常管理带来生机和活力。 那么&#xff0c;在当代环境下建设智慧校园的必要性是什么呢&#x…

Java集合框架-容器源码分析

Java集合框架-容器&源码分析 文章目录 Java集合框架-容器&源码分析[TOC](文章目录)前言一、集合框架概述二、Collection接口及其子接口(List/Set)及实现类2.1 Collection接口中方法2.2 遍历&#xff1a;Iterator迭代器接口&foreach(5.0新特性)2.3 Connection子接口…

Java中使用Redis实现分布式锁的三种方式

1. 导语 随着软件开发领域的不断演进,并发性已经成为一个至关重要的方面,特别是在资源跨多个进程共享的分布式系统中。 在Java中,管理并发性对于确保数据一致性和防止竞态条件至关重要。 Redis作为一个强大的内存数据存储,为在Java应用程序中实现分布式锁提供了一种高效的…

WSL2连接Windows主机的Mysql

文章目录 需求查看主机IP防火墙设置Mysql设置允许远程连接WSL2连接Mysql 需求 在WSL2&#xff08;本机Ubuntu20.04&#xff09;运行的程序需要将数据写入到本机的Mysql服务器中 查看主机IP 两种办法&#xff1a; Windows主机输入 ipconfig&#xff0c;找到带有WSL后缀的部分…

第13章 软件测评相关标准

一、标准化概述 &#xff08;一&#xff09;概念 1、标准 一定范围内获得最佳秩序&#xff0c;经协商一致并由公认机构批准共同使用和重复使用的一种规范性文档&#xff0c;是标准化活动的核心产物。 2、标准化 一定范围内获得最佳秩序&#xff0c;对现实问题和潜在问题制…

ctfshow——SSRF

文章目录 web 351web 352web 353web 354web 355web 356web357web 358web 359web 360 SSRF(Server-Side Request Forgery&#xff1a;服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统…

Java | Leetcode Java题解之第64题最小路径和

题目&#xff1a; 题解&#xff1a; class Solution {public int minPathSum(int[][] grid) {if (grid null || grid.length 0 || grid[0].length 0) {return 0;}int rows grid.length, columns grid[0].length;int[][] dp new int[rows][columns];dp[0][0] grid[0][0]…

【C/C++基础实战】:用C++实现通讯录管理系统——含完整源码

文章目录 通讯录管理系统一、系统需求以及成品演示二、代码实现三、完整代码 通讯录管理系统 一、系统需求以及成品演示 1.1 系统需求 通讯录是一个可以记录亲人、好友信息的工具。这里利用C来实现一个通讯录管理系统 系统中需要实现的功能如下&#xff1a; 添加联系人&am…

【C语言】/*C语言常见概念*/

目录 前言 一、C语言是什么 二、初识编译和链接 三、什么是可执行程序 四、什么是编译器 五、什么是集成开发环境 六、mian函数的特点 七、什么是关键字 八、标识符的命名规则是什么 九、字符和ASCII码表 十、字符串和\0 十一、转义字符 十二、注释 前言 本篇文章…

[蓝桥杯2024]-PWN:fd解析(命令符转义,标准输出重定向,利用system(‘$0‘)获取shell权限)

查看保护 查看ida 这里有一次栈溢出&#xff0c;并且题目给了我们system函数。 这里的知识点没有那么复杂 方法一&#xff08;命令转义&#xff09;&#xff1a; 完整exp&#xff1a; from pwn import* pprocess(./pwn) pop_rdi0x400933 info0x601090 system0x400778payloa…

力扣刷题第0天:只出现一次的数字

目录 第一部分:题目描述 ​第二部分:题目分析 第三部分:解决方法 3.1思路1: 双指针暴力求解 3.2 思路2&#xff1a;异或运算 第四部分:总结收获 第一部分:题目描述 第二部分:题目分析 由图片分析可得&#xff0c;该题目对算法时间复杂度有一定的要求时间复杂度为O(N)&a…

VBA数据库解决方案第十讲:Recordset记录集合的动态查询显示结果

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

爬虫学习:基本网络请求库的使用

目录 一、urllib网络库 1.urlopen()方法 2.request方法 二、requests网络请求库 1.主要方法 2.requests.get()和requests.post() 一、urllib网络库 1.urlopen()方法 语法格式&#xff1a; urlopen(url,data,timeout,cafile,capath,context) # url:地址 # data:要提交的数据…