C++知识点总结(7):玩转高精度除法

news2024/12/24 8:55:43

一、复习高低精度

一个数分为两种类型:

1. 高精度数,即一个长度特别长的数,使用 long long 也无法存储的一类数字。

2. 低精度数,即一个普通的数,可以使用 long long 来存储。

由于高精度除法比较简单,建议大家摸透了高精度加减法和高精度乘法的逻辑(戳蓝色文字进入课程快览)。

二、复习高精度乘法

1. 一共有两个 for 循环,第一个 for 循环遍历第一个因数,第二个 for 循环遍历第二个因数。

2.  for 循环中的值分别是 j = 0 ~ lenb-1,i = 0 ~ lena-1。

3. 计算逻辑:

ans[i+j] = a[i] * b[j] + in + ans[i+j];

4. 输出:

【去前导零】while (ans[len_ans-1] == 0 && len_ans > 1) len_ans--;

【正常逆序输出】ans[len_ans-1] ~ ans[0]

三、存储的基础类型

输入的高精度被除数: char 类型

转换后的高精度被除数: int 类型

低精度除数: int 类型

高精度被除数的位数: int 类型

存储结果: char 类型

答案的长度: int 类型

四、输入与转换

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	// 存储并输入
	char a_str[1005] = {};
	int b;
	cin >> a_str >> b;
	
	// 转换
	int a[1005] = {};
	int len_a = strlen(a_str);
	for (int i = 0; i <= len_a-1; i++)
	{
		a[i] = a_str[i] - 48; // 正序存储 
	} 
    return 0;
}

五、计算过程

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	// 存储并输入
	char a_str[1005] = {};
	int b;
	cin >> a_str >> b;
	
	// 转换
	int a[1005] = {};
	int len_a = strlen(a_str);
	for (int i = 0; i <= len_a-1; i++)
	{
		a[i] = a_str[i] - 48; // 正序存储 
	}
	
	// 计算
	int len_ans = len_a; // 计算次数
	int ans[1005] = {};
	int rem = 0; // 余数 
	for (int i = 0; i <= len_ans-1; i++)
	{
    	ans[i] = (rem * 10 + a[i]) / b; // 写商
    	rem = (rem * 10 + a[i]) % b; // 写余
	}
	
	// 去前导零
	int k = 0; // k 表示第一个不为 0 元素的下标
	while (ans[k] == 0 && k < len_ans-1)
	{
		k++;
	}
	 
	// 正常正序输出
	for (int i = k; i <= len_ans-1; i++)
	{
		cout << ans[i];
	}
    return 0;
}

看一下运行的效果:

六、小数点优化

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	// 存储并输入
	char a_str[1005] = {};
	int b;
	int point = 3; // 保留小数的数位 
	cin >> a_str >> b;
	
	// 转换
	int a[1005] = {};
	int len_a = strlen(a_str);
	for (int i = 0; i <= len_a-1; i++)
	{
		a[i] = a_str[i] - 48; // 正序存储 
	}
	
	// 计算
	int len_ans = len_a; // 计算次数
	int ans[2100] = {};
	int rem = 0; // 余数 
	for (int i = 0; i <= len_ans+point-1; i++)
	{
    	ans[i] = (rem * 10 + a[i]) / b; // 写商
    	rem = (rem * 10 + a[i]) % b; // 写余
	}
	
	// 去前导零
	int k = 0; // k 表示第一个不为 0 元素的下标
	while (ans[k] == 0 && k < len_ans-1)
	{
		k++;
	}
	 
	// 正常正序输出整数部分 
	for (int i = k; i <= len_ans-1; i++)
	{
		cout << ans[i];
	}
	
	// 小数点后判断 
	if (point > 0)
	{
		cout << ".";
		for (int i = len_ans; i <= len_ans+point-1; i++)
		{
			cout << ans[i]; 
		}
	}
    return 0;
}

附录:两数的平均数

#incldue <iostream>
#include <cstring>
using namespace std;

int main()
{
	// 高精度加法
	// 输入并存储 
	char a_str[1005] = {};
	char b_str[1005] = {};
	cin >> a_str >> b_str;
	int a[1005] = {};
	int b[1005] = {};
	int len_a = strlen(a_str);
	int len_b = strlen(b_str);
	for (int i = 0; i <= len_a-1; i++)
	{
		a[len_a-i-1] = a_str[i] = 48;
	}
	for (int i = 0; i <= len_b-1; i++)
	{
		b[len_b-i-1] = b_str[i] = 48;
	}
	
	// 计算
	int sum[1005] = {};
	int len_sum = max(len_a, len_b);
	int in = 0;
	for (int i = 0; i <= len_sum-1; i++)
	{
		sum[i] = a[i] + b[i] + in;
		in = sum[i] / 10;
		sum[i] %= 10;
	}
	
	// 最高位判断
	if (in)
	{
		sum[len_sum] = in;
		len_sum++;
	}
	
	
	
	// 高精度除法
	int divid[1005] = {};
	// 正序存储
	for (int i = 0; i <= len_sum-1; i++)
	{
		divid[len_sum-i-1] = sum[i]; 
	}
	
	// 计算
	int len_ans = len_sum;
	int ans[1005] = {};
	int rem = 0;
	for (int i = 0; i <= len_ans-1; i++)
	{
		ans[i] = (rem * 10 + divid[i]) / 2;
		rem = (rem * 10 + divid[i]) % 2;
	}
	
	// 去前导零
	int k = 0;
	while (ans[k] == 0 && k < len_ans-1)
	{
		k++;
	}
	
	// 输出平均数
	for (int i = k; i <= len_ans-1; i++)
	{
		cout << ans[i];
	}
	return 0; 
}

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

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

相关文章

Android修行手册-ViewPager定制页面切换以及实现原理剖析

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

PaddleOCR学习笔记

Paddle 功能特性 PP-OCR系列模型列表 https://github.com/PaddlePaddle/PaddleOCR#%EF%B8%8F-pp-ocr%E7%B3%BB%E5%88%97%E6%A8%A1%E5%9E%8B%E5%88%97%E8%A1%A8%E6%9B%B4%E6%96%B0%E4%B8%AD PP-OCR系列模型列表&#xff08;V4&#xff0c;2023年8月1日更新&#xff09; 配置文…

我叫:希尔排序【JAVA】

1.我兄弟存在的问题 2.毛遂自荐 希尔排序提希尔(Donald Shell)于1959年提出的一种排序算法。 希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的&…

串口虚拟化工具

串口虚拟工具(Configure Virtual Serial Port Driver v7.2) 可以虚拟化串口 串口成对添加&#xff0c;添加之后可以在设备管理器中查看 链接&#xff1a;https://pan.baidu.com/s/1WE9c28MEoSEY7fGhy4kjag 提取码&#xff1a;yahn DebugTool-v.16 作用&#xff1a;可以检验…

Linux踩坑:arm下gcc编译添加 -Ox 优化后,程序无法正常运行

arm下gcc编译添加 -Ox 优化后&#xff0c;程序无法正常运行 一、问题描述 今天学习正点原子的阿尔法开发板裸机开发的时候&#xff0c;遇到了一个问题&#xff0c;在没有使用 -Ox 优化的时候&#xff0c;编译出来的程序能够正常运行&#xff0c;但是添加了-Ox之后&#xff0c…

思维模型 心里摆效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。情绪受外界影响。 1心里摆效应的应用 1.1 心理摆效应在管理团队中的应用 谷歌公司是一家以创新和创造力著称的科技公司&#xff0c;其“20%时间”政策是该公司管理团队的一个经典案例。该…

面试必问:如何快速定位BUG?BUG定位技巧及N板斧!

01 定位问题的重要性 很多测试人员可能会说&#xff0c;我的职责就是找到bug&#xff0c;至于找原因并修复&#xff0c;那是开发的事情&#xff0c;关我什么事&#xff1f; 好&#xff0c;我的回答是&#xff0c;如果您只想做一个测试人员最基本最本分的事情&#xff0c;那么可…

Arduio开发STM32所面临的风险

据说micro_ros用到了arduino,然后用arduino搞stm32需要用到这个Arduino STM32的东西&#xff0c;然后这里申明了&#xff1a;这些代码没有经过严格测试&#xff0c;如果是向心脏起搏器&#xff0c;自动驾驶这样要求严格的的情况下&#xff0c;这个东西不能保证100%不发生问题&a…

Redis实战篇(一)短信登录

Redis实战篇&#xff08;一&#xff09;短信登录 1.1、导入黑马点评项目 1.1.1 、导入SQL 1.1.2、有关当前模型 手机或者app端发起请求&#xff0c;请求我们的nginx服务器&#xff0c;nginx基于七层模型走的事HTTP协议&#xff0c;可以实现基于Lua直接绕开tomcat访问redis&a…

《尚品甄选》:后台系统——结合redis实现用户登录

文章目录 一、统一结果实体类二、统一异常处理三、登录功能实现四、CORS解决跨域五、图片验证码六、登录校验功能实现6.1 拦截器开发6.2 拦截器注册 七、ThreadLocal 要求&#xff1a; 用户输入正确的用户名、密码以及验证码&#xff0c;点击登录可以跳转到后台界面。未登录的用…

6、独立按键控制LED亮灭

独立按键 轻触按键&#xff1a;相当于是一种电子开关&#xff0c;按下时开关接通&#xff0c;松开是开关断开 实现原理&#xff1a;是通过轻触按键内部的金属弹片受力弹动来实现接通和断开 代码&#xff1a; #include <REGX52.H>void main() {//等同于P20XFE;P2_00…

张弛声音变现课,枪战电影高能量、快速节奏

在执行枪战片的声音配音任务时&#xff0c;配音员应该致力于传递出戏剧性的紧张氛围与动作场面的激烈感。枪战场景往往是高能量、快速节奏的&#xff0c;这就要求配音不仅要与视觉动作紧密结合&#xff0c;还要通过声音来增强动作的逼真度和观众的紧迫感。以下是针对枪战电影进…

IT行业多项目管理的方法与策略:优化资源分配与提升项目成功率

多项目管理已成为项目经理们面临的常态&#xff0c;IT行业如何高效进行项目管理呢&#xff1f; 多项目管理过程中存在的问题 1、多类型项目并行&#xff0c;项目流程掺杂混乱&#xff0c;项目进度难以监控&#xff0c;反应缓慢&#xff0c;容易产生延误风险。 2、团队资源有…

LeetCode-1689. 十-二进制数的最少数目 C/C++实现 超详细思路及过程[M]

&#x1f388;归属专栏&#xff1a;深夜咖啡配算法 &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;上一篇博客这里好像没改&#xff0c;那就不改了。 文章目录 LeetCode-1689. 十-二进制数的最少数目&#x1f697;题目&#x1f686;题目描述&…

2016年11月16日 Go生态洞察:Go字体的创新之旅

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

SpringBoot修改启动图标

公司基于SpringBoot框架再次定制了一个框架,那要怎么让自己封装的框架逼格高一点? 那门面就要与众不同, 哈哈哈!!!! 艺术文字网站: patorjk.com 我这里使用字体是 "怪物" 貌似框架也是使用这个字体,外国人的文化底蕴就是xxxx,推崇妖魔鬼怪

WorldWind Android上加载白模数据

这篇文章介绍下如何加载白模数据。这个白模数据的格式是shapefile格式的文件。白模数据拷贝到手机本地&#xff0c;然后读取白模数据&#xff0c;进行加载展示。 worldwind android本身是不支持加载白模数据的&#xff0c;但是可以根据现有提供的加载Polygons的方式&#xff0c…

自定义精美商品分类列表组件 侧边栏商品分类组件 category组件(适配vue3)

随着技术的发展&#xff0c;开发的复杂度也越来越高&#xff0c;传统开发方式将一个系统做成了整块应用&#xff0c;经常出现的情况就是一个小小的改动或者一个小功能的增加可能会引起整体逻辑的修改&#xff0c;造成牵一发而动全身。通过组件化开发&#xff0c;可以有效实现单…

【Linux】 sudo命令使用

sudo sudo是linux系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;如halt&#xff0c;reboot&#xff0c;su等等。这样不仅减少了root用户的登录 和管理时间&#xff0c;同样也提高了安全性。sudo不是对shell的一个代替…

Spring cloud - Feign

Feign的作用 Feign是Netflix公司开发的声明式web客户端组件&#xff0c;Spring对Feign做了无缝集成&#xff1a; Feign is a declarative web service client. It makes writing web service clients easier. To use Feign create an interface and annotate it. It has plugg…