news 2026/4/16 17:28:57

高精度除法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
高精度除法

高精度除法分为两种情况:

1.高精度/低精度

2.高精度/高精度

对于情况1,高精度/低精度的思想:

首先定义两个long long 类型数据代表除数和余数,在用字符串类型来接收被除数,在定义两个数组分别是被除数数组和结果数组,先把字符串当中的数据正序存储(便于直接从高位开始除,减少计算量),之和遍历被除数数组,结果数组某位的值等于(被除数数组某位的值+余数*10)/除数

,同时需要更新余数(等于(被除数数组某位的值+余数*10)%除数),遍历结束后即除完

最后删去前导0 ,输出结果,具体代码以及细节如下:

#include<bits/stdc++.h> //万能头文件 using namespace std; long long b; //除数 long long x; //余数 int main() { string s; //被除数 cin >> s; cin >> b; vector<int> vec(s.size()+1); //被除数数组 vector<int> vec2(s.size()+1); //结果数组 for (int i = 1; i <= s.size();i++) { vec[i] = s[i - 1]-'0'; //正序存储便于从高位除 } for (int i = 1; i <= s.size();i++) { vec2[i] = (x * 10 + vec[i]) / b; //某位的商等于(上一位的余数*10+本位数字)/b x = (x * 10 + vec[i]) % b; //某位余数等于(上一位的余数*10+本位数字)%b } int begin = 1; while (vec2[begin]==0&&begin<s.size()) { //删除前导0,并且避免删除最后一个0 begin++; } for (int i = begin; i <=s.size();i++) { //输出的时候i从begin开始避免输出前导0 cout << vec2[i]; } }

2.高精度/高精度

思想:

高精度/高精度的思想是把两个数相除的形式转换成两个数一直相减的过程,直到被减数比无法减减数为止,

我们需要设置四个数组,分别是被除数数组,除数数组,商数组和临时数组(临时数组来存储除数数组经过偏移后的数组),

首先输入两字符,利用这两个字符串给被除数数组和除数数组逆序赋值,赋值的同时,需要把数组的第一个元素设置为两数据的长度,

接着,需要给商数组定义长度,商数组最大的时候长度等于被除数的长度减去除数的长度加一,

之后通过补0的方式让除数和被除数的高位数字对齐(保证从高位开始相减,减少计算量),

接着进行判断,当此时的被除数的大小比当前临时数组存储(经过偏移(低位补0)的除数)的数据大的时候,进入while循环(进行减法操作)

被除数比临时数组小的时候,会直接进入第二次for循环(从商数组的高位开始遍历,一直到1结束),

进行下一次的偏移除数数组设置...等上面操作,

在减法操作中,被除数减去临时数组的数据,没减一次,对应的商值需要加一,

同时需要将被除数更新为被除数-临时数组的值,同时还要去除当前被除数的前导0

当for循环结束的时候,此时整体相除完毕,需要去除商数组的前导0,最后输出

#include<bits/stdc++.h> using namespace std; //给数组初始化 void init(vector<int> &vec) { //函数传参的时候需要& string s; cin >> s; vec[0] = s.size(); //把数组下标是0的位置初始化为数组字符串(对应的数据)的长度 for (int i = 0; i < s.size();i++) { vec[s.size() - i] = s[i]-'0'; } } //n代表偏移量(补0) /* 用已有的除数给临时数组tmp赋值,并且给tmp低位赋值为0,让他们高位对齐 相减,会减少计算量 */ void numsBuffer(vector<int> &vec2,vector<int> &tmp,int n) { for (int i = 1; i <=vec2[0];i++) { tmp[n + i] = vec2[i]; tmp[0] = vec2[0] + n; //给临时数组下标是0的位置赋值为临时数组的大小 } } //比较函数:比较当前被除数和当前临时数组(当前除数)的大小 bool compareNUms(vector<int> &vec1,vector<int> &tmp) { if (vec1[0]!=tmp[0]) { //两数组长度不相等,当被除数的长度大于除数长度,返回true return vec1[0] > tmp[0]; } for (int i = vec1[0]; i >=1;i--) { //两数组长度相等,每个元素应该从数据的高位开始比较大小 if (vec1[i]!=tmp[i]) { return vec1[i] > tmp[i]; //某个元素不相等的时候,当被除数数据大的时候,返回true } } return true; //两数据一模一样返回true } //相减函数 void sub(vector<int> &vec1,vector<int> &tmp) { //因为当除数的长度大于被除数的时候,进不去while循环,所以执行当前函数被除数的长度一定大于除数长度 for (int i = 1; i <= vec1[0];i++) { if (vec1[i]<tmp[i]) { vec1[i + 1]--; vec1[i] += 10; } vec1[i] -= tmp[i];//两数相减完,要更新被除数 } //删去前导0(被除数的前导0) while (vec1[vec1[0]]==0&&vec1[0]>1) { //保证有余数 vec1[0]--; } } int main() { const long long len = 1e5 + 10; vector<int> vec1(len,0); //被除数数组 vector<int> vec2(len,0); //除数数组 vector<int> vec3(len,0); //商数组 vector<int> tmp(len,0); //给除数数据偏移后的数组 //初始化被除数和 除数两数组 init(vec1); init(vec2); if (!compareNUms(vec1,vec2)) { //处理被除数的长度小于除数的长度的情况 cout << 0 << endl; /*for (int i = vec1[0]; i >= 1; i--) { //输出余数 cout << vec1[i]; } */ return 0; } vec3[0] = vec1[0] - vec2[0] + 1; //商的长度 //利用减法模拟两数相除的过程,从高位开始相减,给除数的低位补0,让他们高位对齐 for (int i = vec3[0]; i >= 1;i--) { memset(tmp.data(),0,tmp.size()*sizeof(int)); //每次两数相减之和=后,需要重置临时数组(偏移量不同) numsBuffer(vec2,tmp,i-1); //给临时数组赋值(除数数组并低位补0) //只有当当前被除数大于临时数组的除数,才会执行下面的相减函数,否则直接跳过,执行当前下一个大循环 while (compareNUms(vec1, tmp)) { //相减函数 sub(vec1, tmp); vec3[i]++; //执行一次while循环,相当于被除数减去一次除数,对应位置的商需要加一 } } //删去前导0(商数组的前导0) while (vec3[vec3[0]] == 0 && vec3[0] > 1) { vec3[0]--; } //输出商值 for (int i = vec3[0]; i >= 1; i--) { cout << vec3[i]; } cout<<endl; /*for (int i = vec1[0]; i >= 1; i--) { //输出余数 cout << vec1[i]; } */ }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 7:37:10

使用vue时的一些注意事项

1.vue2开发中一些注意事项 1.1数据响应式问题 // ❌ Bug&#xff1a;直接通过索引修改数组元素不会触发更新 this.items[0] new value// ❌ 修改数组长度不会触发更新 this.items.length 0解决方案&#xff1a; // ✅ 使用Vue.set或$set this.$set(this.items, 0, new value)…

作者头像 李华
网站建设 2026/4/16 7:35:40

拣货慢、错发多?1个策略,让东南亚海外仓一件代发效率翻倍!

做东南亚海外仓的同行都懂&#xff0c;最头疼的不是整箱入库&#xff0c;而是零散订单——Shopee、Lazada、TikTok Shop本土零售单、退货单&#xff0c;稍不注意就错发漏发、库存对账难&#xff0c;既耗人力又丢客户。行业数据显示&#xff0c;像一件代发这种拆零拣货占会整个仓…

作者头像 李华
网站建设 2026/4/16 7:37:09

大模型落地实践:97个精选案例助你掌握AI前沿应用技术

《大模型典型示范应用案例集》由阿里云携手99家合作伙伴共同发布&#xff0c;从数百个案例中精选97个优秀案例&#xff0c;分为行业赋能、智能应用和生态服务三类&#xff0c;覆盖医疗、金融、能源等多领域。报告显示上海成为大模型应用热土&#xff0c;大中型企业是主要试验场…

作者头像 李华
网站建设 2026/4/15 22:16:10

2026云+AI应用研究报告:行业大模型落地实战指南

行业大模型是产业智能化升级的关键引擎&#xff0c;云计算已跃升为AI创新核心支撑。AI行业云平台凭借数据基础、安全合规、应用生态等五大优势&#xff0c;成为行业AI应用最佳载体&#xff0c;提供高质量数据、安全机制并降低开发门槛。"AI大模型领地"知识星球提供1万…

作者头像 李华
网站建设 2026/4/16 9:06:42

Python+django基于小程序的民宿预订系统-web pc 手机端

文章目录 系统概述技术架构核心功能特色设计部署方案代码示例&#xff08;Django 模型&#xff09; 系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统概述 PythonDjango 开发的民宿预订系统是…

作者头像 李华
网站建设 2026/4/16 9:09:05

大模型实战案例:运营商如何从“管道“到“智能服务商“的华丽转身

中国运营商借助5GAI技术&#xff0c;从管道提供商转型为智能服务商。文章通过黑龙江数字政府、辽宁12345热线、四川方言保护等20场景案例&#xff0c;展示大模型在政务、社会服务领域的应用成效&#xff0c;实现效率提升和成本降低。同时指出AI落地面临数据融合、高昂训练成本和…

作者头像 李华