高精度问题


目录

算法实现基础 

高精度加法A+B

测试链接 

源代码 

代码重点

高精度减法A-B

测试链接 

源代码 

代码重点

高精度乘法A*b和A*B

测试链接 

源代码 

代码重点

高精度除法A/b和A/B

测试链接 

源代码 

代码重点

高精度求和差积商余


算法实现基础 

本算法调用STL库函数vector容器来使用

vector库的详细用法可查看单链双链表以及vector 中的部分内容

建议学习过vector的使用方法之后再来看本算法文章

由于Java与Python等语言拥有特性可以不使用高精度算法实现

因此本篇文章主要讲解的是c++的高精度算法

高精度加法A+B

测试链接 

洛谷P1601 A+B Problem(高精)

源代码 

c++解法

代码重点

1.数字的存储为倒叙存储。就vector容器的特点来说,在头部插入元素的难度以及数据处理量要远远大于在尾部插入元素,因此对于长整数的存储来说,在vector容器当中倒叙存储(注意字符数组与字符数组的转换),对于答案容器中的数字也是倒叙存储。

2.t的功能包括计算当前位数的和和为下一位的和做进位

3.如果t不为0时证明仍有进位,若此时答案数组全部已经计算完毕则证明要在最高位加一

4.auto类型的设定可以让系统根据函数的返回值类型自动对C进行类型限制

#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int> &A,vector<int> &B)
{vector<int> C;int t = 0;if(A.size()<B.size())return add(B,A);for(int i = 0;i < A.size()||i < B.size();i ++ ){if(i < A.size())t += A[i];if(i < B.size())t += B[i];C.push_back(t%10);t /= 10; }if(t)C.push_back(1);return C;
}
int main()
{string a,b;cin>>a>>b;vector<int> A,B;for(int i = a.size()-1;i >= 0;i -- )A.push_back(a[i]-'0');for(int i = b.size()-1;i >= 0;i -- )B.push_back(b[i]-'0');auto C = add(A,B);for(int i = C.size()-1;i >= 0;i -- )cout<<C[i];return 0;
}

Python解法

a=int(input())
b=int(input())
ans=a+b
print(ans)

高精度减法A-B

测试链接 

 洛谷P2142 高精度减法

源代码 

c++解法

代码重点

1.cmp函数,当大整数A和B的长度不相等时,比较二者长度即可。当二者长度相同时,从最高位依次向下比,当有其中一位不相等时,返回本位比较值即可。当各位都相等时,则返回ture。经过此函数的处理之后,若布尔函数返回true则为A>=B的情况。若布尔函数返回false则为A<B的情况

2.sub函数:t为借位情况,经过cmp函数的调整之后A一定是大于等于B的,所以从最低为开始减,若此位运算结果小于0,则加10再对10取余为本位结果,必向高位进行了借位,因此在下一位运算时-1。若此位运算结果大于等于0,则不进行借位,下次运算时t为0。在进行运算之后,要进行去掉前导0的运算

3.main函数,依旧本着方便运算的原则对于大整数进行倒叙存储,根据cmp函数结果进行分流,当true时为正,倒叙输出C即可。当false时为负,首先输出一个负号,再倒序输出即可

#include <iostream>
#include <vector>
using namespace std;
bool cmp(vector<int> &A,vector<int> &B)
{if(A.size() != B.size())return A.size() > B.size();for(int i = A.size() - 1;i >= 0;i -- ){if(A[i] != B[i])return A[i] > B[i];}return true;
}
vector<int> sub(vector<int> &A,vector<int> &B)
{vector<int> C;int t = 0;for(int i = 0;i < A.size();i ++ ){t += A[i];if(i < B.size())t -= B[i];C.push_back((t + 10) % 10);if(t < 0)t = -1;else t = 0;}while(C.size() > 1 && C.back() == 0)C.pop_back();return C;
}
int main()
{string a,b;cin>>a>>b;vector<int> A,B;for(int i = a.size() - 1;i >= 0;i -- )A.push_back(a[i] - '0');for(int i = b.size() - 1;i >= 0;i -- )B.push_back(b[i] - '0');if(cmp(A,B)){auto C = sub(A,B);for(int i = C.size() - 1;i >= 0;i -- )cout<<C[i];}else{cout<<"-";auto C = sub(B,A);for(int i = C.size() - 1;i >= 0;i -- )cout<<C[i];}
}

 Python3

a=int(input())
b=int(input())
ans=a-b
print(ans)

高精度乘法A*b和A*B

测试链接 

 洛谷P1303 A*B Problem

源代码 

c++解法(b为短数据)

代码重点

1.c++代码为大整数乘以小整数,因此对于洛谷的那道题来说只能通过40%的数据。高精度大乘小的原理在于A从最低为乘b乘到最高位,其中的t为进位,乘b之后当前位为(t + A[i] * b)%10,进位为((t + A[i] * b)%10)/10

2.其余依旧是大整数通过string和vector进行逆序存储逆序输出

#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
vector<int> mul(vector<int> &A,ll &b)
{vector<int> C;int t = 0;for(int i = 0;i < A.size() || t;i ++ ){if(i < A.size())t += A[i] * b;C.push_back(t % 10);t /= 10;}return C;
} 
int main()
{string a;ll b;cin>>a>>b;vector<int> A;for(int i = a.size() - 1;i >= 0;i -- )A.push_back(a[i] - '0');auto C = mul(A,b);for(int i = C.size() - 1;i >= 0;i -- )cout<<C[i];return 0;
}

Python3(B为长数据)

A*B太麻烦直接用Python3

a=int(input())
b=int(input())
ans=a*b
print(ans)

高精度除法A/b和A/B

测试链接 

洛谷P1480 A/B Problem

源代码 

 c++解法(b为短数据)

代码重点

1.与高精度加法、减法、乘法不同的是,高精度除法在div函数之中对于A的遍历顺序为从为到头,因存储时为倒叙存储,即为从最高位开始计算。所以,r作为一个余数来模拟人工算法,因一道题当中很可能不仅仅只对于除法进行考察,很有可能是四则运算,因此为了方便起见,C需要反转一下便于后面的输出,注意在反转之后要去掉前导零,因洛谷上的b为小整数小于10^9,因此能够通过所有数据测试点

2.部分题目可能要输出余数,因此将输出余数那一行的注释去掉就ok了

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
vector<int> div(vector<int> &A,ll &b,ll &r)
{vector<int> C;r = 0;for(int i = A.size() - 1;i >= 0;i -- ){r = r * 10 + A[i];C.push_back(r / b);r = r % b; }reverse(C.begin(),C.end());while(C.size() > 1 && C.back() == 0)C.pop_back();return C;
}
int main()
{string a;ll b,r;cin >> a >> b;vector<int> A;for(int i = a.size() - 1;i >= 0;i -- )A.push_back(a[i] - '0');auto C = div(A,b,r);for(int i = C.size() - 1;i >= 0;i -- )cout<<C[i];//cout<<endl<<r;//此处输出的为余数return 0;
}

Python3解法(B为长数据)

a=int(input())
b=int(input())
ans=a//b
print(ans)

高精度求和差积商余

c++太太太太太头疼了还是Python3比较暴力省事

a=int(input())
b=int(input())
print(a+b)
print(a-b)
print(a*b)
print(a//b)
print(a%b)

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

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

相关文章

基于Spring Boot的中国戏曲文化传播系统

一、系统背景与意义 中国戏曲作为中华民族的文化瑰宝&#xff0c;具有深厚的历史底蕴和艺术价值。然而&#xff0c;随着现代生活节奏的加快和娱乐方式的多样化&#xff0c;传统戏曲文化的传播和普及面临诸多挑战。因此&#xff0c;开发一个基于Spring Boot的中国戏曲文化传播系…

GitLab安装及使用

目录 一、安装 1.创建一个目录用来放rpm包 2.检查防火墙状态 3.安装下载好的rpm包 4.修改配置文件 5.重新加载配置 6.查看版本 7.查看服务器状态 8.重启服务器 9.输网址 二、GitLab的使用 1.创建空白项目 2.配置ssh 首先生成公钥&#xff1a; 查看公钥 把上面的…

14-zookeeper环境搭建

0、环境 java&#xff1a;1.8zookeeper&#xff1a;3.5.6 1、下载 zookeeper下载点击这里。 2、安装 下载完成后解压&#xff0c;放到你想放的目录里。先看一下zookeeper的目录结构&#xff0c;如下图&#xff1a; 进入conf目录&#xff0c;复制zoo_sample.cfg&#xff0…

C++---------动态内存管理

以下是对 C 中相关概念的详细说明及代码示例&#xff1a; 一、动态分配和堆 new 操作符&#xff1a; new 操作符用于在堆上动态分配内存。它会调用对象的构造函数&#xff08;如果是类对象&#xff09;并返回指向分配内存的指针。示例&#xff1a; #include <iostream&g…

R语言数据分析案例46-不同区域教育情况回归分析和探索

一、研究背景 教育是社会发展的基石&#xff0c;对国家和地区的经济、文化以及社会进步起着至关重要的作用。在全球一体化进程加速的今天&#xff0c;不同区域的教育发展水平呈现出多样化的态势。这种差异不仅体现在教育资源的分配上&#xff0c;还表现在教育成果、教育投入与…

单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?

单机和微服务的区别&#xff0c;微服务有什么问题&#xff1f;数据一致性问题怎么解决&#xff1f;幂等问题怎么解决&#xff1f; 单机架构和微服务架构在设计理念、部署和扩展性上有显著区别。 单机架构 vs 微服务架构 单机架构 定义&#xff1a;所有组件&#xff08;前端…

基于springboot+vue实现的卷烟营销统计分析系统 (源码+L文+ppt)4-129

摘 要 卷烟行业的快速发展使得卷烟营销统计分析系统成为了一个必不可少的工具。基于Java的卷烟营销统计分析系统旨在提供高效、准确和便捷的适用卷烟营销服务。本文讲述了基于java语言开发&#xff0c;后台数据库选择MySQL进行数据的存储。该软件的主要功能是进行卷烟营销统计…

mac启ssh服务用于快速文件传输

x.1 在mac上启SSH服务 方法一&#xff1a;图形交互界面启ssh&#xff08;推荐&#xff09; 通过sharing - advanced - remote login来启动ssh&#xff1b;&#xff08;中文版mac应该是 “系统设置 → 通用 → 共享”里打开“远程登录”来启动&#xff09; 查看自己的用户名和…

青蛇人工智能学家

青蛇人工智能学家 青蛇&#xff0c;是蓝星上&#xff0c;最出名的人工智能学家。 在蓝星上&#xff0c;大家都知道&#xff0c;青蛇人工智能学家&#xff0c;最大的爱好&#xff0c;是美食。 青蛇人工智能学家&#xff0c;对自己的食物&#xff0c;非常在意&#xff0c;对自己的…

[c++进阶(三)]单例模式及特殊类的设计

1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢&#xff1f;本篇将会详细的介绍 本章重点&#xff1a; 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…

【LLM论文日更】| 训练大型语言模型在连续潜在空间中进行推理

论文&#xff1a;https://arxiv.org/pdf/2412.06769代码&#xff1a;暂未开源机构 &#xff1a;Meta领域&#xff1a;思维链发表&#xff1a;arxiv 研究背景 研究问题&#xff1a;这篇文章要解决的问题是如何在大语言模型&#xff08;LLMs&#xff09;中实现一种新的推理范式&…

opc da 服务器数据 转 opc ua项目案例

目录 1 案例说明 2 VFBOX网关工作原理 3 应用条件 4 查看OPC DA服务器的相关参数 5 配置网关采集opc da数据 6 用opc ua协议转发采集的数据 7 在服务器上运行仰科OPC DA采集软件 8 案例总结 1 案例说明 在OPC DA服务器上运行OPC DA client软件查看OPC DA服务器的相关参…

学习threejs,PerspectiveCamera透视相机和OrthographicCamera正交相机对比

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PerspectiveCamera透…

PHP后执行php.exe -v命令报错并给出解决方案

文章目录 一、执行php.exe -v命令报错解决方案 一、执行php.exe -v命令报错 -PHP Warning: ‘C:\windows\SYSTEM32\VCRUNTIME140.dll’ 14.38 is not compatible with this PHP build linked with 14.41 in Unknown on line 0 解决方案 当使用PHP8.4.1时遇到VCRUNTIME140.dll…

分布式调度框架学习笔记

一、分布式调度框架的基本设计 二、线程池线程数量设置的基本逻辑 cpu是分时复用的方法&#xff0c;线程是cpu调度的最小单元 如果当前cpu核数是n&#xff0c;计算密集型线程数一般设为n&#xff0c;io密集型(包括磁盘io和网络io)线程数一般设置为2n. 计算密集型线程数一般设…

vue 基础学习

一、ref 和reactive 区别 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><div id"app"><h1>{{Web.title}}</h1><h1&…

CI/CD是什么?

CI/CD 定义 CI/CD 代表持续集成和持续部署&#xff08;或持续交付&#xff09;。它是一套实践和工具&#xff0c;旨在通过自动化构建、测试和部署来改进软件开发流程&#xff0c;使您能够更快、更可靠地交付代码更改。 持续集成 (CI)&#xff1a;在共享存储库中自动构建、测试…

论文阅读:Deep Fusion Clustering Network With Reliable Structure Preservation

论文地址&#xff1a;Deep Fusion Clustering Network With Reliable Structure Preservation | IEEE Journals & Magazine | IEEE Xplore 代码地址&#xff1a;https://github.com/gongleii/DFCN-RSP 摘要 深度聚类通过优雅地利用数据表示来寻找样本的划分&#xff0c;已…

InnoDB存储引擎【MySQL从放弃到入门】

文章目录 InnoDB存储引擎【MySQL从放弃到入门】1.逻辑架构1.1 一条SQL语句是怎么执行的呢&#xff1f;1.2 MySQL存储引擎有哪些&#xff1f; 2.MySQL一行记录是怎么存储的&#xff1f;2.1 NULL值是如何存储的&#xff1f; 3.char和varchar的区别&#xff1f;4.数据页4.1 聚簇索…

Jenkins集成部署(图文教程、超级详细)

一、CI/CD 的概念 ​ CI/CD一般包含三个概念&#xff1a; 持续集成&#xff08;Continuous Integration &#xff0c;CI&#xff09; 持续交付&#xff08;Continuous Delivery&#xff09; 持续部署&#xff08;Continuous Deploy&#xff09; ​ CI/CD 是现代软件开发的重要…