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

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

一、复习高低精度

一个数分为两种类型:

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; 
}

相关文章:

  • JAVA后端开发技术报告
  • 【Pytorch】Visualization of Fature Maps(2)
  • electron 问题记录
  • 大数据学习(23)-hive on mapreduce对比hive on spark
  • 性能压测工具:wrk
  • 报错0x0000007b问题解决
  • 【经典小练习】输出文件路径名
  • Vue中的$nextTick的作用
  • QT visual stdio加载动态库报错126问题
  • 【代码随想录】算法训练计划28
  • 5、LED流水灯
  • python:傅里叶分析,傅里叶变换 FFT
  • vue2-006——使用脚手架搭建vue2项目+项目结构分析
  • OpenGL 图元赋色(Qt)
  • 大数据预处理技术
  • 【译】JS基础算法脚本:字符串结尾
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【刷算法】求1+2+3+...+n
  • EventListener原理
  • IOS评论框不贴底(ios12新bug)
  • Javascript基础之Array数组API
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JAVA之继承和多态
  • jquery cookie
  • Otto开发初探——微服务依赖管理新利器
  • PHP的类修饰符与访问修饰符
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 观察者模式实现非直接耦合
  • 机器学习中为什么要做归一化normalization
  • 检测对象或数组
  • 前端攻城师
  • 微信小程序:实现悬浮返回和分享按钮
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 学习ES6 变量的解构赋值
  • 正则表达式小结
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • (003)SlickEdit Unity的补全
  • (1)(1.13) SiK无线电高级配置(六)
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (Python第六天)文件处理
  • (二)正点原子I.MX6ULL u-boot移植
  • (二开)Flink 修改源码拓展 SQL 语法
  • (九)信息融合方式简介
  • (一)u-boot-nand.bin的下载
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .Net各种迷惑命名解释
  • .NET中winform传递参数至Url并获得返回值或文件
  • .one4-V-XXXXXXXX勒索病毒数据怎么处理|数据解密恢复
  • /var/log/cvslog 太大