【算法】高精度

news2024/12/24 9:27:17

作者:指针不指南吗
专栏:算法篇

🐾不能只会思路,必须落实到代码上🐾

文章目录

  • 前言
  • 一、高精度加法
  • 二、高精度减法
  • 三、高精度乘法
  • 四、高精度除法

前言

​ 高精度即很大很大的数,超过了 long long 的范围,不能直接读取进行运算,需要用 string 读入,然后存储在数组中去。

​ 高精度算法即把每一位上的数单独拿出来,分别计算,再跟每一位之间的关系,再研究,最后结果仍然存在数组中并输出。


一、高精度加法

  1. 思路

    • 大整数的存储
      • 使用 vector 存储,a[0] 存储个位,依次往后最后存储最高位
    • 代码思想
      • 从个位数开始依次,让a,b每一位相加,结果取模存在结果数组C中,t 表示进位
      • 每次两个数a,b的各个位相加再加上进位t
      • 直到加到最高位
  2. 模板

    #include<bits/stdc++.h>
    using namespace std;
    
    //C=A+B
    vector<int> add(vector<int> &A,vector<int> &B)//引用减少时间,不使用引用即把原数据copy一遍,费时间 
    {
    	vector<int> C;  //定义一个结果答案
        
        if(A.size()<B.size()) return add(B,A);
    	int t=0;   //t表示进位,个位开始,无需+进位,即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);  
    		t/=10;  //求进位 
    	} 
    	
    	if(t) C.push_back(1);  //离开循环时,t没有加 
    	
    	return C;
    }
    
    int main()
    {
    	string a,b;
    	vector<int> A,B;
    	
    	cin>>a>>b;  //输入123456
    	
    	//存储大整数  倒着存储 
    	for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');   //存储 6,5,4,3,2,1
    	for(int i=b.size()-1;i>=0;i--) B.push_back(b[i]-'0');   //注意这里是字符串的长度a
    	
    	auto C=add(A,B);
    	
    	for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);  //注意 倒序输出
    	 
    	return 0;
    }
    

二、高精度减法

  1. 思路

    • 大整数的存储
    • 核心思想
      • 确保是大数减小数,首先从个位开始作差,取模存储在C中,t 表示借位(这里很巧妙具体看下面的代码
      • 每次各个位上的数作差 - 借位 t ,取模存起来,有借位 t=1,没有t=0;
      • 直到 大整数.size( ) 去前导0
  2. 模板

    #include<bits/stdc++.h>
    using namespace std;
    
    //判断两个大整数的大小 
    bool cmp(vector<int> &A,vector<int> &B){  
    	if(A.size()!=B.size()) return A.size()>B.size();  //位数不同时 
    	if(A.size()==B.size())   //位数相同时 
    		for(int i=0;i<A.size();i++)
    			if(A[i]!=B[i]) return A[i]>B[i];
    }
    
    //C=A-B
    vector<int> sub(vector<int> &A,vector<int> &B)
    {
    	if(!cmp(A,B)) {
    		cout<<'-';    //如果小减去大数:注意加个 - 负号 
    		return sub(B,A);  //交换 
    	}
    	
    	vector<int> C;
    	int t=0;  //t表示借位 
    	
    	for(int i=0;i<A.size();i++){
    		t=A[i]-t;  //各个位上的数,先减去借位
    		if(i<B.size()) t-=B[i];    //B还有数的话,减去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();  //去掉前导0 如003 
    	
    	return C;
    }
    
    int main()
    {
    	string a,b;
    	vector<int> A,B;
    	
    	cin>>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=sub(A,B);
    	
    	for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);
    	
    	return 0;
     } 
    

三、高精度乘法

高精度乘法一般是 一个大整数乘一个比较小的数

  1. 思路

    • 大整数的存储

    • 核心思想

      • 小的数b不拆,让b依次和大数A的每一位相乘从A的个位开始,t表示进位;
      • 对每次计算A[i]*b+t的结果取模,存在结果数组中,借位除10即可,t可以任意大,比如可以进位22
      • 直到 大数的最高位&&t==0去掉前导0
    1. 模板
    #include<bits/stdc++.h>
    using namespace std;
    
    //C=A*b
    vector<int> mul(vector<int> &A,int b)
    {
    	vector<int> C;
    	int t=0;  //t表示进位
    	for(int i=0;i<A.size()||t;i++){   //两个条件都满足才能退出来,否则没有计算完
    		t=A[i]*b+t;   //A的每一位与b相乘加上进位
    		C.push_back(t%10);   //对计算结果取模,存在结果数组中
    		t/=10;  
    	}
        
    	while(C.size()>1&&C.back()==0) C.pop_back();  //去掉前导0
        
    	return C;
    }
    
    int main()
    {
    	string a;
    	int b;   // 小的数用int 来存就OK
    	vector<int> A;
    	
    	cin>>a>>b;
    	
    	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--) printf("%d",C[i]);
    	
    	return 0;
     } 
    

四、高精度除法

高精度除法一般是一个大的整数除以一个小的整数

  1. 思路

    • 大整数的存储
    • 核心思想
      • 从最高位开始,最高位除以除数,余数r剩下;
      • r*10+大整数的下一位,再除以除数,余数r剩下;
      • 重复,直到个位去掉前导0
  2. 模板

#include<bits/stdc++.h>
using namespace std;
          
//A➗b=C...r
vector<int> div(vector<int> &A,int b,int &r)
{
 	vector<int> C;
  	r=0;  //r表示余数
    for(int i=A.size()-1;i>=0;i--){
   	r=r*10+A[i];  //新的除数
   	C.push_back(r/b);   //把商存下来
    r%=b;  //取余数
}
          	
    reverse(C.begin(),C.end());   //反正问题,现在虽然是正序,但是与其他运算保持一致,输出的反序,所以现在反过来,负负得正
    while(C.size()>1&&C.back()==0) C.pop_back();  //去掉前导0
          	
    return C;
}
          
          
int main()
{
  	string a;
 	int b;
    vector<int> A;
          	
    cin>>a>>b;
          	
    for(int i=a.size()-1;i>=0;i--)  A.push_back(a[i]-'0');
          	
   	int r;   //除法多个一个余数
    auto C=div(A,b,r);
          	
    for(int i=C.size()-1;i>=0;i--)  printf("%d",C[i]);
          printf("\n");
	 	  printf("%d",r);
       	  return 0;
   }

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

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

相关文章

html标签手册

完整的HTML页面&#x1f4d1; ①基础标签&#x1f4d1;&#x1f4d1;&#x1f4d1; HTML <!DOCTYPE> 声明 !DOCTYPE声明必须是 HTML 文档的第一行&#xff0c;位于 html标签之前。 !DOCTYPE 声明不是 HTML 标签&#xff1b;它是指示 web 浏览器关于页面使用哪个 HTML 版…

硬件设计 之 CAN通信-DSView逻辑分析仪使用-CAN波形测试

CAN总线讲解 1.基本概念&#xff1a; **CAN&#xff0c;Controller Area Network&#xff0c;控制器局域网是用于解决汽车众多控制部件之间的数据交换而开发的一种串行数据通信总线。 ** 2.CAN总线电平&#xff1a; can总线采用差分电压传输数据&#xff0c;分别是CANH和CA…

QCon演讲实录(上):多云环境下应用管理与交付实践

作者&#xff1a;阿里云大数据基础工程技术团队——郭耀星 大家上午好&#xff01;我是来自阿里云大数据基础工程技术团队的郭耀星&#xff0c;花名雪尧。今天我很高兴能够来到QCon&#xff0c;与大家分享我的经验和心得。在当前的多云环境中&#xff0c;作为运维支撑团队&…

GPDB中的HASH JOIN解析

GPDB中的HASH JOIN机制Hash Join是利用hash函数来实现和加速数据库中JOIN操作的一类算法。主要优势是hash函数可以只通过一次运算就将键值映射到固定大小的hash值&#xff0c;仅用作等值join中。由于HASH JOIN的算法复杂度在平均情况下是O(n)&#xff0c;所以通常在大规模数据时…

【K3s】第15篇 使用containerd容器部署k3s集群

目录 1、文件准备 2、安装master节点 3、安装agent节点 4、查看详情信息 5、遇到问题 1、文件准备 安装docker yum install -y dockersystemctl status docker 增加docker国内镜像源 vi /etc/docker/daemon.json 添加内容为&#xff1a; { "registry-mirrors":…

MySQL:为什么说应该优先选择普通索引,尽量避免使用唯一索引

前言 在使用MySQL的过程中&#xff0c;随着表数据的逐渐增多&#xff0c;为了更快的查询我们需要的数据&#xff0c;我们会在表中建立不同类型的索引。 今天我们来聊一聊&#xff0c;普通索引和唯一索引的使用场景&#xff0c; 以及为什么说推荐大家优先使用普通索引&#xf…

面试题(二十四)数据结构与算法

9.1哈希 请谈一谈&#xff0c;hashCode() 和equals() 方法的重要性体现在什么地方&#xff1f; 考察点&#xff1a;JAVA哈希表 参考回答&#xff1a; Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引&#xff0c;当根据键获取值的时候也会用到这两个方法。…

【OJ】本土化

&#x1f4da;Description: 激动人心的时刻到了&#xff01;我们开发的记账软件即将在欧美地区发布&#xff0c;但我希望能把本土化工作做得更好。所谓的本土化可不仅仅是把软件界面语言翻译成英语&#xff0c;还要根据当地的习俗来调整软件的使用方法。 比如我国在书写数字…

【yolov5】首次尝试目标检测利用prompt

1、打开prompt 2、切换到pytorch所在环境 conda activate freezing我的环境名是freezing&#xff0c;这里根据自己环境名去激活切换 3、进入到yolov5项目所在路径 激活完环境后立即执行指令当然是无效的&#xff0c;首先要进入到你的项目目录 首先看一下自己的项目在那个位…

MongoDB分片集群部署及实践

文章目录MongoDB分片集群部署及实践一、前言二、了解分片集群1.简介2.分片集群组件3.副本集模式三.安装部署1.分片集群环境2.安装1&#xff09;CPU 检测2&#xff09;修改机器名称3&#xff09;配置 hosts 文件4&#xff09;配置防火墙5&#xff09;创建目录6&#xff09;安装 …

PowerBI的使用和基本效果

1. 什么是PowerBI Power BI 是一套商业分析工具&#xff0c;用于在组织中提供见解。可连接数百个数据源、简化数据准备并提供即席分析。生成美观的报表并进行发布&#xff0c;供组织在 Web 和移动设备上使用。每个人都可创建个性化仪表板&#xff0c;获取针对其业务的全方位独…

加一-力扣66-java高效方案

一、题目描述给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。示例 1&#xff1a;输入&#xff1a;di…

PostgreSQL的下载安装教程(macOS、Windows)

postgresql是GIS服务端几乎不可避免要打交道的数据库。因为mysql的空间扩展真是不尽人意。所以想要学会GIS服务端知识,postgresql(下文简称pg)你是必须要会的。 首先要知道,pg是一个空间数据库,和普通数据库不同的是pg支持空间数据的存储与操作。这里所谓的空间数据一般指…

1、为什么要经常对数据做特征归一化

前言&#xff1a; feature scaling 即为特征归一化、标准化&#xff0c;是数据预处理中的重要技术。在实际运用中&#xff0c;使用梯度下降算法的模型都需要归一化&#xff0c;包括线性回归、逻辑回归、支持向量机、神经网络等模型。但对决策树模型并不适用&#xff0c;因为信…

【LeetCode】每日一题(3)

目录 题目&#xff1a;1234. 替换子串得到平衡字符串 - 力扣&#xff08;Leetcode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 写在最后&#xff1a; 题目&#xff1a;1234. 替换子串得到平衡…

handler解析(3)-同步消息、异步消息、同步屏障

Message分为3种&#xff1a;普通消息&#xff08;同步消息&#xff09;、屏障消息&#xff08;同步屏障&#xff09;和异步消息。我们通常使用的都是普通消息&#xff0c;而屏障消息就是在消息队列中插入一个屏障&#xff0c;在屏障之后的所有普通消息都会被挡着&#xff0c;不…

使用继承与派生的6大要点

概述 面向对象编程技术非常看重软件的可重用性&#xff0c;在C中&#xff0c;可重用性是通过继承机制来实现的。继承机制允许程序员在保持原有类的数据和功能的基础上进行扩展&#xff0c;增加新的数据和功能&#xff0c;从而构成一个新的类&#xff0c;也称为派生类。原有类&a…

分销系统逻辑

相关概念 主营商户: 提供分销商品和佣金的商户分销商: 拥有自己的销售渠道&#xff0c;能够帮助推动产品销售的个人或商户消费者: 购买分销商品的人。佣金: 主营商户返还给经销商的比例抽成 分销功能设计 (1)分销商准入规则设计 无规则: 没有分销商的准入门槛限制&#xf…

七大设计原则之依赖倒置原则应用

目录1 依赖倒置原则2 依赖倒置应用1 依赖倒置原则 依赖倒置原则&#xff08;Dependence Inversion Principle,DIP&#xff09;是指设计代码结构时&#xff0c;高层模块不应该依赖底层模块&#xff0c;二者都应该依赖其抽象。抽象不应该依赖细节&#xff1b;细节应该依赖抽象。…

VHDL语言基础-Testbech

目录 VHDL仿真概述: 基本结构: VHDL一般仿真过程: 仿真测试平台文件: 编写测试平台文件的语言: 一个测试平台文件的基本结构如下&#xff1a; 测试平台文件包含的基本语句: 产生激励信号的方式: 时钟信号: 复位信号: 周期信性信号: 使用延迟DELAYD: 一般的激励信号…