当前位置: 首页 > news >正文

【算法基础】(一)基础算法 ---高精度

✨个人主页:bit me
✨当前专栏:算法基础
🔥专栏简介:该专栏主要更新一些基础算法题,有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下,互相监督打卡学习 🌹 🌹 🌹

高 精 度

  • 🎄 一.高精度加法
  • 🌲二.高精度减法
  • 🌳三.高精度乘法
  • 🌴四.高精度除法

🎄 一.高精度加法

给定两个正整数(不含前导 0 ),计算它们的和。

输入格式:

共两行,每行包含一个整数。

输出格式:

共一行,包含所求的和。

数据范围:

1 ≤ 整数长度 ≤ 100000

输入样例:

12
23

输出样例:

35

思路:

  1. 首先我们们要考虑的是怎样储存数据。结合我们所学应该使用数组储存数据,但是数组下标开头是放个位数还是末尾数呢,在这里我们需要注意一下,在加法当中有进位,如果我们把最高位放在下标为0开头,想要进位就要把所有的数字都挪动一步,而最高位数字如果放在数组末尾就直接添加进位就可以,由此我们第一步就是处理整数的储存。

  2. 处理好整数之后,我们还要实现他们加减法如何进行。创建一个临时结果C来接收A+B的每一个对应位相加的结果,在这里C的取值是俩位数相加取模,还要考虑是不是有进位,所以在这里我们还需创建一个t来进行判断进位。

题解:

  1. 把a,b用字符串的形式储存赋给数组,因为String表示长度length可以使用size方法
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
String b = scanner.next();
List<Integer> A = new ArrayList<>(a.length());
List<Integer> B = new ArrayList<>(b.length());
  1. 按照第一步思路,最高位放在数组最后很容易添加进位,直接用add就可以实现
for(int i = a.length() - 1;i >= 0; i --) A.add(a.charAt(i) - '0');
for(int i = b.length() - 1;i >= 0; i --) B.add(b.charAt(i) - '0');

charAt返回指定下标下面的char值,后面减去0是为了把字符变成数字

  1. 实现我们的加法函数
List<Integer> C = add(A,B);

1.用新的数组C来一个一个接收A和B的每一个对应位相加的结果,注意取值是模
2.使用临时变量t来判断是否进位,然后实现进位,如果加法循环结束,t不是为0就要最高位进1

public static List<Integer> add(List<Integer> A ,List<Integer> B){List<Integer> C = new ArrayList<>();int t = 0;for(int i = 0;i < A.size() || i < B.size();i++){if(i < A.size()) t += A.get(i);if(i < B.size()) t += B.get(i);C.add(t % 10);t = t/10;}if(t != 0) C.add(1);return C;}

 
附上总的代码

public static void main(String[] args){Scanner scanner = new Scanner(System.in);String a = scanner.next();String b = scanner.next();List<Integer> A = new ArrayList<>(a.length());List<Integer> B = new ArrayList<>(b.length());for(int i = a.length() - 1;i >= 0; i --) A.add(a.charAt(i) - '0');for(int i = b.length() - 1;i >= 0; i --) B.add(b.charAt(i) - '0');List<Integer> C = add(A,B);for(int i = C.size() - 1;i >= 0; i--){System.out.print(C.get(i) + "");}}
public static List<Integer> add(List<Integer> A ,List<Integer> B){List<Integer> C = new ArrayList<>();int t = 0;for(int i = 0;i < A.size() || i < B.size();i++){if(i < A.size()) t += A.get(i);if(i < B.size()) t += B.get(i);C.add(t % 10);t = t/10;}if(t != 0) C.add(1);return C;}

 

🌲二.高精度减法

给定两个正整数(不含前导 0),计算它们的差,计算结果可能为负数。

输入格式:

共两行,每行包含一个整数。

输出格式:

共一行,包含所求的差。

数据范围:

1 ≤ 整数长度 ≤ 105

输入样例:

32
11

输出样例:

21

思路:

  1. 计算依旧是数组储存,然后倒序,和加法一样

  2. 我们在A-B中考虑到A可能比B小,得数为负数,那我们要先判断A和B的大小。两种判别方式,第一,首先判断A和B长度大小,也就是数位多少;第二,如果数位相同,那么则需要从最高位依次往最低位挪动对应比较。

  3. 创建临时变量C来接收计算的结果,创建减法函数,在减法函数中依次让A的每一位减去B中对应的每一位数字,其中还需判断一下B的存在性,还要注意把t带上,因为不知道有没有借位,最后就是要注意非0前面还有0的情况,就需要删去,只有一个0的情况要保留。

题解:

  1. 把a,b用字符串的形式储存赋给数组
Scanner scanner = new Scanner(System.in);
String s1 = scanner.next();
String s2 = scanner.next();
List<Integer> A = new ArrayList<>();
List<Integer> B = new ArrayList<>();
for(int i = s1.length() - 1;i >= 0;i --) A.add(s1.charAt(i) - '0');
for(int i = s2.length() - 1;i  >= 0; i --) B.add(s2.charAt(i) - '0');
  1. 判断A-B的正负,并完善函数
if(!cmp(A,B)){System.out.print("-");
}
public static boolean cmp(List<Integer> A,List<Integer> B){
if(A.size() != B.size()) return A.size() > B.size();for(int i = A.size() - 1;i >= 0;i --){if(A.get(i) != B.get(i)) {return A.get(i) > B.get(i);}
}
return true;
}

函数里第一步的操作相当于

if(A.size() >= B.size()){return true;
}else{return false;
}
  1. 创建C来接收A-B的结果,并完善函数
List<Integer> C = sub(A,B);

在对应位A-B中应该是A.get(i) - B.get(i) - t ,因为可能B为零,所以需要判断一下是不是存在
 
还需考虑C的取值是取模,然后借位t是否被借位
 
最后还需考虑非0前面还有0的情况,就需要删去,只有一个0的情况要保留。

public static List<Integer> sub(List<Integer> A,List<Integer> B){
if(!cmp(A,B)){return sub(B,A);
}List<Integer> C = new ArrayList<>();
int t = 0;
for(int i = 0;i < A.size();i ++){t = A.get(i) - t;if(i < B.size()) t -= B.get(i);C.add((t + 10) % 10);if(t < 0) t = 1;else t = 0;
}
while(C.size() > 1 && C.get(C.size() - 1) == 0)  C.remove(C.size() - 1);return C;
}

 
附上总的代码

public static void main(String[] args){Scanner scanner = new Scanner(System.in);String s1 = scanner.next();String s2 = scanner.next();List<Integer> A = new ArrayList<>();List<Integer> B = new ArrayList<>();for(int i = s1.length() - 1;i >= 0;i --) A.add(s1.charAt(i) - '0');for(int i = s2.length() - 1;i  >= 0; i --) B.add(s2.charAt(i) - '0');if(!cmp(A,B)){System.out.print("-");}List<Integer> C = sub(A,B);for(int i = C.size() - 1;i >= 0; i --){System.out.print(C.get(i));}}public static List<Integer> sub(List<Integer> A,List<Integer> B){if(!cmp(A,B)){return sub(B,A);}List<Integer> C = new ArrayList<>();int t = 0;for(int i = 0;i < A.size();i ++){t = A.get(i) - t;if(i < B.size()) t -= B.get(i);C.add((t + 10) % 10);if(t < 0) t = 1;else t = 0;}while(C.size() > 1 && C.get(C.size() - 1) == 0)  C.remove(C.size() - 1);return C;}public static boolean cmp(List<Integer> A,List<Integer> B){if(A.size() != B.size()) return A.size() > B.size();for(int i = A.size() - 1;i >= 0;i --){if(A.get(i) != B.get(i)) {return A.get(i) > B.get(i);}}return true;}
}

 

🌳三.高精度乘法

给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。
输入格式:

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式:

共一行,包含 A×B的值。

数据范围:

1 ≤ A的长度 ≤ 100000
,
0≤B≤10000

输入样例:

2
3

输出样例:

6

思路:

  1. 在我们乘法计算当中,例如123×45,我们在平时的计算方式和计算机不一样,我们是一个一个数字相乘得到得结果再相加,在计算机里这里我们可以把第一串数字看作是字符串,第二串数字不变,用第二个数字乘第一串字符串的每一个字符,按照这样的计算方式我们可以得到一个规律,比如用临时变量C来接收每一个结果,C中除了第一个和最后一个数,中间的每一个得数都是 = (字符 n × 第二串数字 + 进数t)% 10

  2. 非0前面还有0的情况,就需要删去,只有一个0的情况要保留。

题解:

  1. 对A中的数倒序遍历到数组中
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
int b = scanner.nextInt();
List<Integer> A = new ArrayList<>(a.length());
for(int i = a.length() - 1; i >= 0;i --) A.add(a.charAt(i) - '0');
  1. 创建变量C来接收结果以及完成计算过程
public static List<Integer> mul(List<Integer> A ,int b){List<Integer> C = new ArrayList<>();int t = 0;for(int i = 0;i < A.size() || t != 0;i ++ ){if(i < A.size()) t += A.get(i) * b;C.add(t % 10);t /= 10;}while(C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);return C;
}

t != 0表示只要进制不为空就一直循环,直到乘法算完
最后一步处理非0前面还有0的情况,就需要删去,只有一个0的情况要保留。

 
附上总的代码

public static void main(String[] args){Scanner scanner = new Scanner(System.in);String a = scanner.next();int b = scanner.nextInt();List<Integer> A = new ArrayList<>(a.length());for(int i = a.length() - 1; i >= 0;i --) A.add(a.charAt(i) - '0');List<Integer> C = mul(A,b);for(int i = C.size() - 1 ;i >= 0;i --){System.out.print(C.get(i));}
}
public static List<Integer> mul(List<Integer> A ,int b){List<Integer> C = new ArrayList<>();int t = 0;for(int i = 0;i < A.size() || t != 0;i ++ ){if(i < A.size()) t += A.get(i) * b;C.add(t % 10);t /= 10;}while(C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);return C;
}

 

🌴四.高精度除法

给定两个非负整数(不含前导 0) A,B,请你计算 A/B 的商和余数。

输入格式:

共两行,第一行包含整数 A,第二行包含整数 B。

输出格式:

共两行,第一行输出所求的商,第二行输出所求余数。

数据范围:

1≤A的长度≤100000
1≤B≤10000
B一定不为 0

输入样例:

7
2

输出样例:

3
1

思路:

  1. 除法里我们从高位往低位除,剩下的余数作为低一位的数的十位数来除,所以每一个余数剩下后给下一位都要乘以10,每一位的得数都是相除得来的,余数就是取模得来的。

  2. 非0前面还有0的情况,就需要删去,只有一个0的情况要保留。

题解:

  1. 对A中的数倒序遍历到数组中
Scanner scanner = new Scanner(System.in);
String a = scanner.next();
int b = scanner.nextInt();
List<Integer> A = new ArrayList<>(a.length());
for(int i = a.length() - 1;i >= 0;i --) A.add(a.charAt(i) - '0');
  1. 用临时变量接收结果并且完善函数
List<Integer> C = div(A,b);
public static List<Integer> div(List<Integer> A,int b){List<Integer> C = new ArrayList<>();int r = 0;for(int i = A.size() - 1 ;i >= 0; i --){r = r * 10 + A.get(i);C.add(r / b);r %= b;}Collections.reverse(C);while(C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);C.add(r);return C;
}

这一段函数包括了计算过程以及结果中0得处理结果,上面详细讲解这里不做过多解释

 
附上总的代码

public static void main(String[] arg){Scanner scanner = new Scanner(System.in);String a = scanner.next();int b = scanner.nextInt();List<Integer> A = new ArrayList<>(a.length());for(int i = a.length() - 1;i >= 0;i --) A.add(a.charAt(i) - '0');List<Integer> C = div(A,b);for(int i = C.size() - 2;i >= 0;i --) System.out.print(C.get(i));System.out.println();System.out.print(C.get(C.size() - 1));
}
public static List<Integer> div(List<Integer> A,int b){List<Integer> C = new ArrayList<>();int r = 0;for(int i = A.size() - 1 ;i >= 0; i --){r = r * 10 + A.get(i);C.add(r / b);r %= b;}Collections.reverse(C);while(C.size() > 1 && C.get(C.size() - 1) == 0) C.remove(C.size() - 1);C.add(r);return C;
}

相关文章:

【算法基础】(一)基础算法 ---高精度

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;算法基础 &#x1f525;专栏简介&#xff1a;该专栏主要更新一些基础算法题&#xff0c;有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下&#xff0c;互相监督打卡学习 &#x1f339; &#x1f339; &#x1f3…...

电源口防雷器电路设计方案

电源口防雷电路的设计需要注意的因素较多&#xff0c;有如下几方面&#xff1a;1、防雷电路的设计应满足规定的防护等级要求&#xff0c;且防雷电路的残压水平应能够保护后级电路免受损坏。2、在遇到雷电暂态过电压作用时&#xff0c;保护装置应具有足够快的动作响应速度&#…...

【零基础入门前端系列】—表单(七)

【零基础入门前端系列】—表单&#xff08;七&#xff09; 一、什么是表单 表单在Web网页中用来给访问者填写信息&#xff0c;从而采集客户信息端&#xff0c;使得网页具有交互功能。一般是将表单设计在一个HTML文档中&#xff0c;当用户填写完信息后做提交操作&#xff0c;于…...

Linux安装python3

Linux安装python3一.介绍二.下载三.配置1.文件夹2.安装依赖3.安装4.配置4.1python关系4.2配置测试-映射python3文件4.2.1 不用设置默认python3为默认版本4.2.2 将python3设置默认版本一.介绍 因为我的Centos7虚拟机里面只有python2.7.5&#xff0c;我想安装一个python3但是还要…...

怎么通过中级职称有窍门吗?

中级职称评审对人才加薪、升职自然不必说&#xff0c;更重要的是职称证书对于公司和企业同样具有重要的价值和意义&#xff0c;因此只要是说公司办理资质或者有项目招投标的公司对于人才参加中级职称评审毫无疑问会给予大力支持&#xff0c;既然工程师职称有这么多的好处&#…...

SAP ABAP根据事务码查找增强最直接的方法

下面是为任意事务代码查找用户出口的步骤&#xff1a; 方法一&#xff1a; 第 1 步&#xff1a;使用 事务代码&#xff1a;SE93。输入您要搜索用户出口的 事务代码。 在我们的场景中&#xff0c;我们将使用 CO11N。 第 2 步&#xff1a;点击显示&#xff1a; 第 3 步&#xf…...

HTTP协议——详细讲解

目录 一、HTTP协议 1.http 2.url url的组成&#xff1a; url的保留字符&#xff1a; 3.http协议格式​编辑 ①http request ②http response 4.对request做出响应 5.GET与POST方法 ①GET ②POST 7.HTTP常见Header ①Content-Type:: 数据类型(text/html等)在上文…...

echonet-dynamic代码解读

1 综述 一共是这些代码&#xff0c;我们主要看echo.py&#xff0c;segmentation.py&#xff0c;video.py&#xff0c;config.py。 2 配置文件config.py 基于配置文件设置路径。 """Sets paths based on configuration files."""import conf…...

大气温室气体浓度不断增加,导致气候变暖加剧,随之会引发一系列气象、生态和环境灾害怎样解决?

大气温室气体浓度不断增加&#xff0c;导致气候变暖加剧&#xff0c;随之会引发一系列气象、生态和环境灾害。如何降低温室气体浓度和应对气候变化已成为全球关注的焦点。海洋是地球上最大的“碳库”,“蓝碳”即海洋活动以及海洋生物&#xff08;特别是红树林、盐沼和海草&…...

字符串内存分配

涉及三块区域&#xff1a;栈&#xff0c;堆&#xff0c;字符串常量池&#xff08;jdk1.7之前在方法区&#xff0c;jdk1.7之后在堆中&#xff09; 关于字符串常量池到底在不在堆中&#xff1a; jdk1.6及以前&#xff0c;方法区独立存在&#xff08;不在堆里面&#xff09;&…...

CHI协议通道概念

通道定义为一组结点之间的通信信号。CHI协议定义了四种通道&#xff0c;请求REQ、响应RSP、侦听SNP和数据DAT。 RN结点上CHI协议通道信号组包括&#xff1a; 请求发送端信号&#xff0c;RN结点发送读/写等请求&#xff0c;从不接收请求响应接收端信号&#xff0c;RN结点接收来…...

XQuery 简介

XQuery 简介 解释 XQuery 最佳方式是这样讲&#xff1a;XQuery 相对于 XML 的关系&#xff0c;等同于 SQL 相对于数据库表的关系。 XQuery 被设计用来查询 XML 数据 - 不仅仅限于 XML 文件&#xff0c;还包括任何可以 XML 形态呈现的数据&#xff0c;包括数据库。 您应该具备的…...

Spring的Bean的生命周期与自动注入细节

1. Bean的生命周期 通过一个LifeCycleBean和一个MyBeanPostProcessor来观察Bean的生命周期: 构造(实例化)->依赖注入(前后处理)->初始化(前后处理)->销毁 LifeCycleBean Component public class LifeCycleBean {private static final Logger log LoggerFactory.g…...

谷粒商城:订单中心概念解析

1、订单中心 电商系统涉及到 3 流&#xff0c;分别时信息流&#xff0c;资金流&#xff0c;物流&#xff0c;而订单系统作为中枢将三者有机的集 合起来。 订单模块是电商系统的枢纽&#xff0c;在订单这个环节上需求获取多个模块的数据和信息&#xff0c;同时对这 些信息进行加…...

快递员配送手机卡,要求当面激活有“猫腻”吗?

咨询&#xff1a;快递员配送手机卡&#xff0c;要求当面激活有“猫腻”吗&#xff1f;有些朋友可能在网上看到了一些关于快递小哥激活会采集信息的文章&#xff0c;所以觉得让快递小哥激活流量卡并不安全&#xff0c;其实&#xff0c;哪有这么多的套路&#xff0c;只要你自己在…...

Sage X3 ERP的称重插件帮助食品和化工企业实现精细化管理

目录 需要称重插件管理的行业客户 Sage X3 ERP称重插件管理的两个关键单位 Sage X3 ERP称重插件的特色 Sage X3 ERP称重插件管理的重要性 需要称重插件管理的行业客户 术语“实际重量”表示在销售和运输时捕获的物品重量。生产销售家禽、肥料、钢材或任何其他需要跟踪实…...

【笔试强训】Day_01

目录 一、选择题 1、 2、 3、 4、 5、 6、 7、 8、 9、 10、 二、编程题 1、组队竞赛 2、删除公共字符 一、选择题 1、 以下for循环的执行次数是&#xff08;&#xff09; for(int x 0, y 0; (y 123) && (x < 4); x); A 、是无限循环 B 、循环次…...

字节跳动青训营--前端day9

文章目录前言PC web端一、 前端Debug的特点二、 前端Debug的方式1. 浏览器动态修改元素和样式2. Console3. Sorce Tab4. NetWork5. Application6. Performancee7. Lighthouse移动端调试IOSAndroid通过代理工具调试前言 仅以此文章记录学习。 PC web端 一、 前端Debug的特点 …...

如何把模糊的照片还原?

在我们工作和学习中&#xff0c;经常需要各种各样的照片&#xff0c;方便我们需要时可以使用。比如写文档就需要添加图片、或者上传文章、视频等都需要使用图片。由于网络上的图片质量都不一样&#xff0c;难免会遇到不能满足自己的需求。如果是遇到了模糊的照片&#xff0c;如…...

29-Golang中的切片

Golang中的切片基本介绍切片在内存中的形式切片使用的三种方式方式一&#xff1a;方式二&#xff1a;方式三&#xff1a;切片使用的区别切片的遍历切片注意事项和细节说明append函数切片的拷贝操作string和slice基本介绍 1.切片是数组的一个引用&#xff0c;因此切片是引用类型…...

污水处理通气帽标准尺寸参数与国标通气帽定制要点

在好些个工程现场当中&#xff0c;人们往往会忽略掉一个看起来平常但是特别要害的小部件——通气帽。特别是在污水处理的体系当中&#xff0c;它承担平衡内部和外部的气压&#xff0c;阻止异味向外溢出&#xff0c;阻拦异物进入等好几个方面的功能。要是选择类型不适合&#xf…...

为初创团队搭建统一的大模型api网关以控制开发成本

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为初创团队搭建统一的大模型API网关以控制开发成本 对于初创技术团队而言&#xff0c;快速验证产品想法、迭代功能是生存的关键。在…...

DupeGuru终极指南:三步快速清理重复文件释放磁盘空间

DupeGuru终极指南&#xff1a;三步快速清理重复文件释放磁盘空间 【免费下载链接】dupeguru Find duplicate files 项目地址: https://gitcode.com/gh_mirrors/du/dupeguru 你是否经常遇到电脑存储空间不足的困扰&#xff1f;是否发现大量重复文件占据了宝贵的磁盘空间&…...

音乐解锁终极指南:打破平台限制,释放你的音乐收藏

音乐解锁终极指南&#xff1a;打破平台限制&#xff0c;释放你的音乐收藏 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址…...

Arduino程序背后的秘密:从setup/loop到main函数,带你读懂官方核心库源码

Arduino程序背后的秘密&#xff1a;从setup/loop到main函数&#xff0c;带你读懂官方核心库源码 当你第一次打开Arduino IDE&#xff0c;写下setup()和loop()函数时&#xff0c;有没有想过这些代码最终是如何在硬件上运行的&#xff1f;为什么我们不需要写main函数&#xff1f;…...

macOS 上 GNS3 快速部署与跨 VLAN 通信实战

1. macOS 下 GNS3 的快速安装指南 第一次接触 GNS3 是在准备 CCNP 认证的时候&#xff0c;当时为了省下买真机的钱&#xff0c;在 MacBook Pro 上折腾了好几天。现在回想起来&#xff0c;如果当时有人能给我一份详细的安装指南&#xff0c;至少能少走一半弯路。GNS3 作为网络工…...

别再用默认表格了!手把手教你定制SPSS输出样式,打造专属报告模板

别再用默认表格了&#xff01;手把手教你定制SPSS输出样式&#xff0c;打造专属报告模板 在数据分析领域&#xff0c;SPSS作为经典工具被广泛应用于市场研究、学术论文和商业决策中。然而&#xff0c;许多专业用户长期被一个问题困扰&#xff1a;系统默认生成的表格样式过于基础…...

智能图像去重引擎:解放数字存储空间的完整解决方案

智能图像去重引擎&#xff1a;解放数字存储空间的完整解决方案 【免费下载链接】AntiDupl A program to search similar and defect pictures on the disk 项目地址: https://gitcode.com/gh_mirrors/an/AntiDupl 在数字内容爆炸的时代&#xff0c;重复图片问题已成为技…...

HS2-HF_Patch:让Honey Select 2体验全面升级的智能补丁

HS2-HF_Patch&#xff1a;让Honey Select 2体验全面升级的智能补丁 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经因为语言障碍而无法完全享受Honey…...

SpringBoot生产级监控与异常日志运维实战,线上项目稳定排查不慌

SpringBoot项目本地开发调试正常&#xff0c;部署到生产环境后频繁出现接口报错、服务卡顿、内存溢出、接口响应缓慢、数据库连接耗尽等线上问题&#xff0c;开发者无法实时查看项目运行状态&#xff0c;报错无精准日志定位&#xff0c;排查问题耗时费力&#xff0c;严重影响业…...