高精度乘法C++

news/2024/5/19 20:37:33
1.高精度乘高精度的简单算法

思想:倒置相乘,统一处理进位,还原。

复杂度: o ( n 2 ) o(n^2) o(n2)

// By SnowDream
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
string s1,s2;
int n1[N],n2[N],n3[N];//n1储存被乘数,n2储存乘数,n3储存积void mul()
{int l1=(int)s1.size();int l2=(int)s2.size();//读取字符串转换为int类型并倒置储存至数组for(int i=0;i<l1;++i){n1[l1-1-i]=s1[i]-'0';}for(int i=0;i<l2;++i){n2[l2-1-i]=s2[i]-'0';}for(int i=0;i<l1;++i){for(int j=0;j<l2;++j){n3[i+j]+=n1[i]*n2[j];}}//处理进位int l_max=l1+l2;for(int i=0;i<l_max;++i){n3[i+1]+=n3[i]/10;n3[i]%=10;}if(n3[l_max])l_max++;while(n3[l_max-1]>=10){n3[l_max]=n3[l_max-1]/10;n3[l_max-1]%=10;l_max++;}while(n3[l_max-1]==0&&l_max>1)l_max--;for(int i=l_max-1;i>=0;i--){cout << n3[i];}
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cin >> s1 >> s2;mul();return 0;
}
2.高精度乘高精度FFT优化算法

思想:将两个大整数看作多项式的系数,然后利用FFT算法在 O ( n l o g n ) O(n log n) O(nlogn)的时间复杂度内计算出它们的乘积,并最终得到乘积的各位数字。

复杂度: o ( n l o g ( n ) ) o(nlog(n)) o(nlog(n))

具体步骤:

  1. 将输入的两个大整数转换为对应的多项式表示,其中每个数字位作为多项式的系数。
  2. 对两个多项式进行补零操作,使其长度变为2的幂,方便进行FFT运算。
  3. 利用FFT算法对两个多项式进行快速傅里叶变换,得到它们在频域上的表示。
  4. 将两个多项式在频域上进行点乘操作,得到它们的乘积在频域上的表示。
  5. 对乘积进行逆FFT操作,得到乘积多项式在时域上的表示。
  6. 对乘积多项式进行进位处理,并输出最终的乘积结果。
// By SnowDream
#include<bits/stdc++.h>
using namespace std;#define L(x) (1<< (x))
typedef long long ll;
const int N=1e5+10;const double PI = acos(-1.0);
string s1,s2;
double ax[N],ay[N],bx[N],by[N];
int n1[N],n2[N],n3[N];//将一个整数x的二进制表示进行位逆序排列,并返回结果。
// 函数接受两个参数:整数x和表示位数的整数bits
int reverseBits(int x, int bits)
{int ret = 0;//存储位逆序排列后的结果,初始化为0for(int i=0;i<bits;++i)//循环bits次,对x的二进制表示进行位逆序排列{ret <<= 1;//将ret左移一位,为下一位的值腾出位置ret |=x&1;//将x的最低位与ret进行或操作,将x的最低位值添加到ret的最低位x >>=1;//将x右移一位,准备处理下一位}return ret;
}void fft(double * a, double * b, int n, bool rev)
{int bits = 0;// 计算n的二进制表示中位数while (1 << bits < n) ++bits;// 找到大于n的最小的2的幂for (int i = 0; i < n; i++){int j = reverseBits(i, bits);// 将i按照bits位反转后的值赋给jif (i < j)// 交换a和b数组中i和j位置的值{swap(a[i], a[j]);swap(b[i], b[j]);}}for (int len = 2; len <= n; len <<= 1)// 迭代每个长度为len的子序列{int half = len >> 1;// 子序列长度的一半double wmx = cos(2 * PI / len), wmy = sin(2 * PI / len);// 计算旋转因子的实部和虚部if (rev) wmy = -wmy;// 如果是逆变换,则虚部取相反数for (int i = 0; i < n; i += len)// 遍历每个子序列的起始位置{double wx = 1, wy = 0;// 初始化旋转因子for (int j = 0; j < half; j++)// 遍历子序列的前半部分{double cx = a[i + j], cy = b[i + j];// 获取当前位置的实部和虚部double dx = a[i + j + half], dy = b[i + j + half];// 获取对应的另一半的实部和虚部double ex = dx * wx - dy * wy, ey = dx * wy + dy * wx;// 计算旋转后的值a[i + j] = cx + ex, b[i + j] = cy + ey;// 更新前半部分的值a[i + j + half] = cx - ex, b[i + j + half] = cy - ey;// 更新后半部分的值double wnx = wx * wmx - wy * wmy, wny = wx * wmy + wy * wmx;// 计算下一个旋转因子wx = wnx, wy = wny;// 更新旋转因子}}}if (rev){for (int i = 0; i < n; i++)a[i] /= n, b[i] /= n;// 对结果进行归一化}
}int solve(int l1,int l2,int ans[])
{int len = max(l1, l2), ln;for(ln=0; L(ln)<len; ++ln);// 找到大于len的最小的2的幂len=L(++ln);// 计算2的幂for (int i = 0; i < len ; ++i){if (i >= l1) ax[i] = 0, ay[i] =0;// 如果i超过l1,则ax[i]和ay[i]赋值为0else ax[i] = n1[i], ay[i] = 0;// 否则将n1[i]赋值给ax[i],ay[i]赋值为0}fft(ax, ay, len, false);// 进行快速傅里叶变换for (int i = 0; i < len; ++i){if (i >= l2) bx[i] = 0, by[i] = 0;// 如果i超过l2,则bx[i]和by[i]赋值为0else bx[i] = n2[i], by[i] = 0;// 否则将n2[i]赋值给bx[i],by[i]赋值为0}fft(bx, by, len, false);// 进行快速傅里叶变换for (int i = 0; i < len; ++i){double cx = ax[i] * bx[i] - ay[i] * by[i];// 计算乘积的实部double cy = ax[i] * by[i] + ay[i] * bx[i];// 计算乘积的虚部ax[i] = cx, ay[i] = cy;// 更新ax和ay数组的值}fft(ax, ay, len, true);// 进行逆快速傅里叶变换for (int i = 0; i < len; ++i)ans[i] = (int)(ax[i] + 0.5);// 四舍五入取整return len;
}void mul()
{int l;int i;string ans;memset(n3, 0, sizeof(n3));int l1 = (int)s1.size();int l2 = (int)s2.size();for(i = 0; i < l1; i++)n1[i] = s1[l1 - i - 1]-'0';for(i = 0; i < l2; i++)n2[i] = s2[l2-i-1]-'0';l = solve(l1,l2, n3);for(i = 0; i<l || n3[i] >= 10; i++) // 进位{n3[i + 1] += n3[i] / 10;n3[i] %= 10;}l = i;while(n3[l] <= 0 && l>0) l--; // 检索最高位for(i = l; i >= 0; i--)cout << n3[i]; // 倒序输出
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cin >> s1 >> s2;mul();cout << "\n";return 0;
}
3.高精度乘单精度

思想:倒置相乘,统一处理进位,再还原。

复杂度: o ( n ) o(n) o(n)

// By SnowDream
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
string s1;
int s2;
int n1[N];
void mul()
{string ans;int l1 = (int)s1.size();for(int i=0;i<l1;++i){n1[l1-1-i]=s1[i]-'0';}int w=0;for(int i=0;i<l1;++i){n1[i]=n1[i]*s2+w;w=n1[i]/10;n1[i]=n1[i]%10;}while(w){n1[l1++]=w%10;w/=10;}for(int i=l1-1;i>=0;i--)cout << n1[i];
}int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cin >> s1 >> s2;mul();cout << "\n";return 0;
}

http://www.mrgr.cn/p/57155152

相关文章

cmake进阶:文件操作

一. 简介 前面几篇文章学习了 cmake的文件操作&#xff0c;写文件&#xff0c;读文件。文章如下&#xff1a; cmake进阶&#xff1a;文件操作之写文件-CSDN博客 cmake进阶&#xff1a;文件操作之读文件-CSDN博客 本文继续学习文件操作。主要学习 文件重命名&#xff0c;删…

商城系统推荐,如何找到一款可靠的商城系统?

如今&#xff0c;电商系统成为商家必不可少的营销工具&#xff0c;其系统在金融、外贸、零售等行业领域应用广泛。那么&#xff0c;作为初试水的企业又没有挑选电商系统的经验&#xff0c;如何找到拥有全功能、全渠道、可靠的网上商城系统呢&#xff1f; 我们可以先按电商系统…

MySQL技能树学习

在MySQL中&#xff0c;DDL&#xff08;数据定义语言&#xff09;用于定义数据库对象&#xff08;如表、索引、视图等&#xff09;&#xff0c;DML&#xff08;数据操纵语言&#xff09;用于操作数据库中的数据&#xff08;如插入、更新、删除数据&#xff09;&#xff0c;DQL&a…

读天才与算法:人脑与AI的数学思维笔记20_数学图灵测试

读天才与算法:人脑与AI的数学思维笔记20_数学图灵测试1. 数学图灵测试 1.1. 能不能将这种计算机证明语言翻译成易于与人交流的方式呢? 1.1.1. 剑桥大学的两位数学家蒂莫西高尔斯(Timothy Gowers)和莫汉加内萨林加姆(Mohan Ganesalingam)开展了此项研究 1.1.1.1. 他们决定…

百度语音识别开发笔记

目录 简述 开发环境 1、按照官方文档步骤开通短语音识别-普通话 2、创建应用 3、下载SDK 4、SDK集成 5、相关接口简单说明 5.1权限和key 5.2初始化 5.3注册回调消息 5.4开始转换 5.5停止转换 6、问题 简述 最近想做一些语音识别的应用&#xff0c;对比了几个大厂…

Fluent 区域交界面的热边界条件

多个实体域公共交界面的壁面&#xff0c;Fluent 会分拆为 wall 和 wall-shadow 的两个壁面&#xff0c;两者为配对关系&#xff0c;分别从属于一个实体域。 配对面可使用热通量、温度、耦合三类热边界条件&#xff0c;前两者统称为非耦合热边界条件。 耦合为配对面默认的热边界…

人工智能的发展将如何重塑网络安全

微信搜索关注公众号网络研究观&#xff0c;获取更多信息。 人们很容易认为人工智能 (AI) 真正出现是在 2019 年&#xff0c;当时 OpenAI 推出了 ChatGPT 的前身 GPT-2。 但现实却有些不同。人工智能的基础可以追溯到 1950 年&#xff0c;当时数学家艾伦图灵发表了题为“计算机…

【算法】滑动窗口——无重复字符的最长子串

本篇博客是一篇滑动窗口算法练习题——无重复字符的最长子串的思路详解&#xff0c;从最开始的暴力解法&#xff0c;优化以及怎么想到滑动窗口这种算法的一个详细思路过程&#xff0c;有需要借鉴即可。 目录 1.题目解读2.暴力求解3.暴力求解的优化4.题解代码示例 1.题目解读 题…

软考中级-软件设计师(九)数据库技术基础 考点最精简

一、基本概念 1.1数据库与数据库系统 数据&#xff1a;是数据库中存储的基本对象&#xff0c;是描述事物的符号记录 数据库&#xff08;DataBase&#xff0c;DB&#xff09;&#xff1a;是长期存储在计算机内、有组织、可共享的大量数据集合 数据库系统&#xff08;DataBas…

Angular基础-搭建Angular运行环境

这篇文章介绍了在Angular项目中进行开发环境搭建的关键步骤。包括node.js安装和配置、安装Angular CLI工具、安装angular-router、创建Angular项目等步骤。这篇文章为读者提供了清晰的指南&#xff0c;帮助他们快速搭建Angular开发环境&#xff0c;为后续的项目开发奠定基础。 …

EPYC 9B14(最强 Zen4 EPYC 2.6GHz 96c)简要上手感受

[CPU] EPYC 9B14(最强 Zen4 EPYC 2.6GHz 96c)简要上手感受 [复制链接] zlcrxp电梯直达 1# 发表于 2024-1-31 08:43 | 只看该作者 |只看大图 本帖最后由 zlcrxp 于 2024-1-31 16:47 编辑近期看到海鲜市场有EPYC 9B14,于是入手了一颗,由于入手时间比较短,目前先提供一些基本…

音视频开发4 FFmpeg windows 环境搭建,QT 安装,动态库的搜索路径

FFmpeg 为了让所有平台的开发者都能够学习到音视频开发的通用技术&#xff0c;本教程主要讲解跨平台的音视频开发库FFmpeg。其实只要你掌握了FFmpeg&#xff0c;也可以很快上手其他音视频开发库&#xff0c;因为底层原理都是一样的&#xff0c;你最终操作的都是一样的数据&…

opencv图片的平移-------c++

图片平移 cv::Mat opencvTool::translateImage(const cv::Mat& img, int dx, int dy) {// 获取图像尺寸int rows img.rows;int cols img.cols;// 定义仿射变换矩阵cv::Mat M (cv::Mat_<float>(2, 3) << 1, 0, dx, 0, 1, dy);// 进行仿射变换cv::Mat dst;cv…

HTTP协议相关文档

HTTP The Hypertext Transfer Protocol (HTTP) is an application-level protocol for distributed, collaborative, hypermedia information systems. bing.com 翻译: 超文本传输协议 (HTTP) 是用于分布式的、协作的、超媒体信息系统的 应用程序级协议。IETF Internet Engi…

YPay源支付Mini Pro免授权使用版v1.0

YPay源支付Mini Pro免授权使用版v1.0 &#xff0c;修改host屏蔽Pro授权站&#xff0c;可有效防止因用户操作不当导致免授权程序无法执行时 执行授权官方的盗版入库代码&#xff0c;尽可能保证网站安全 1.安装SG14组件 注&#xff1a;仅防止二次开发添加授权 2.”/etc/host”文…

ArthasGC日志GCeasy详解

Arthas详解 Arthas是阿里巴巴在2018年9月开源的Java诊断工具,支持JDK6,采用命令行交互模式,可以方便定位和诊断线上程序运行问题.Arthas官方文档十分详细.详见:官方文档 Arthas使用场景 Arthas使用 # github下载arthas wget https://alibaba.github.io/arthas/arthas-boot.j…

Elasticsearch:探索 11 种流行的机器学习算法

作者&#xff1a;来自 Elastic Elastic Platform Team 过去几年中&#xff0c;机器学习&#xff08;ML&#xff09;已经悄然成为我们日常生活中不可或缺的一部分。它影响着从购物网站和流媒体网站上的个性化推荐&#xff0c;到保护我们的收件箱免受我们每天收到的大量垃圾邮件的…

用户中心(下)

文章目录 计划登录逻辑接口简单说明cookie和session写代码流程后端逻辑层控制层测试用户管理接口 前端简化代码对接后端代理 计划 开发完成后端登录功能 &#xff08;单机登录 > 后续改造为分布式 / 第三方登录&#xff09;✔开发后端用户的管理接口 &#xff08;用户的查询…

【Docker学习】docker start深入研究

docker start也是很简单的命令。但因为有了几个选项&#xff0c;又变得复杂&#xff0c;而且... 命令&#xff1a; docker container start 描述&#xff1a; 启动一个或多个已停止的容器。 用法&#xff1a; docker container start [OPTIONS] CONTAINER [CONTAINER...] 别名&…

大数据技术架构

一、hadoop 1、基础知识 1.1、概念 ①Hadoop集群特点&#xff1a;高可靠性、高效性、高可拓展性、高容错性、成本低、运行在Linux操作系统上、支持多种编程语言 ②Hadoop的由来&#xff1a; 谷歌的三驾马车对应的开源软件描述GFS&#xff1a;海量数据怎么存HDFS分布式文件…