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

【算法基础】高精度除法

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前是C语言 + 算法学习者
✈️专栏:【C/C++】算法
🐋 希望大家多多支持,咱一起进步!😁
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


前言

往期我们学习了高精度加法、高精度减法 和 高精度乘法,本站就是高精度算法最后一站了!闲言少叙,开快车🚝🚝


目录

  • 前言
  • 一、算法由来
  • 二、算法基本思想
  • 三、算法思路
  • 四、代码模板

一、算法由来

前提:两个数都是正整数。当被除数的位数非常长时,再同时除以上位数较短的b。最后结果大到unsigned long long都存不了,这就要用到高精度除法。

二、算法基本思想

高精度算法同样也是计算机模拟人类竖式计算,并将其转化计算机语言的过程。

现在来回忆一下,小学除法我们是如何列竖式来解决的

在这里插入图片描述

三、算法思路

  • 首先,我们用数组存高精度数字(被除数)。为了方便读入,采用字符串读入。为什么要采用字符串读入呢?原因是数据位数过长
  • 其次,将其转化成数字存进vector<int>数组中。存进数组的时候一定要=倒着存入。
  • 然后,就是两数相除的过程了,初始化余数t = 0,两数相除,t = t * 10 + A[i] t临时用来存储每一次余数的结果。
  • 对于答案,只需要t / b即是,为了保留上一步的余数t,只需要将t = t % b
  • 再次重复以上操作,直到被除数全部都遍历完为止
  • 在除法运算中,计算顺序是从高位向低位开始运算,因此A的前导0是在vector的前面而不是尾部(详情见算法基本思想),因此为了方便去除前导0,我们将A翻转,这样0就位于数组尾部,可以使用pop函数删除前导0
  • 最后再逆序输出结果就是答案,输出t就是余数

四、代码模板

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;vector<int> div(vector<int> &A, int b, int &t)
{vector<int> C;//存储答案t = 0;//初始化余数为0//除法从高位开始算起for (int i = A.size() - 1; i >= 0; i -- ){//上一次的余数乘10,再加上当前位上的数,就是被除数t = t * 10 + A[i];//商的计算C.push_back(t / b);//保留下一次的余数t %= b;}//翻转是为了方便取出前导0reverse(C.begin(), C.end());//去除前导0while (C.size() > 1 && C.back() == 0) {C.pop_back();}//返回答案return C;
}int main()
{string a;//字符串读入被除数int b; //除数int t; //余数vector<int> A; //读入cin >> a >> b;//倒序存入A中for (int i = a.size() - 1; i >= 0; i -- ) {A.push_back(a[i] - '0');}vector<int> C = div(A, b, t);//输出商for (int i = C.size() - 1; i >= 0; i -- ) {printf("%d",C[i]);    }//输出余数printf("\n%d\n",t);return 0;
}
http://www.lryc.cn/news/5877.html

相关文章:

  • optimizer.zero_grad(), loss.backward(), optimizer.step()的理解及使用
  • 融资、量产和一栈式布局,这家Tier 1如此备战高阶智驾决赛圈
  • centos7.8安装oralce11g
  • 【蓝桥杯集训·每日一题】AcWing 3956. 截断数组
  • 万丈高楼平地起:Linux常用命令
  • Linux(Linux的连接使用)
  • Unity中画2D图表(2)——用XChart包绘制散点分布图 + 一条直线方程
  • Go 排序包 sort
  • Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染
  • CNI 网络流量分析(六)Calico 介绍与原理(二)
  • 短视频标题的几种类型和闭坑注意事项
  • 操作系统——1.操作系统的概念、定义和目标
  • 【html弹框拖拽和div拖拽功能】原生html页面引入vue语法后通过自定义指令简单实现div和弹框拖拽功能
  • 2023新华为OD机试题 - 计算网络信号(JavaScript) | 刷完必过
  • 27.边缘系统的架构
  • 机器学习强基计划8-1:图解主成分分析PCA算法(附Python实现)
  • Hudi-集成Spark之spark-shell 方式
  • Python爬虫:从js逆向了解西瓜视频的下载链接的生成
  • Numpy-如何对数组进行切割
  • Python之字符串精讲(下)
  • Python图像卡通化animegan2-pytorch实例演示
  • 谢希仁版《计算机网络》期末总复习【完结】
  • 问:React的useState和setState到底是同步还是异步呢?
  • 深度理解机器学习16-门控循环单元
  • Python中Generators教程
  • 数据结构与算法基础-学习-10-线性表之栈的清理、销毁、压栈、弹栈
  • Leetcode 每日一题 1234. 替换子串得到平衡字符串
  • 【MYSQL中级篇】数据库数据查询学习
  • 华为OD机试真题JAVA实现【火星文计算】真题+解题思路+代码(20222023)
  • Linux基础知识