关于高精度除法

高精度除法 ​高精度除法计算原理 在读小学时,我们做除法都采用竖式方法计算。被除数从高位开始,和除数对齐,逐位“试商”,“试商”后除数减去“试商”的数的乘积,如下图所示 采用计算机做高精度除法时,模拟日常除法的步骤。但计算机不可能做“试商”,这时,我们可以采用减法来模拟。 阅读详情

输入m,n输出其商的整数部分。
思路1:用减法模拟除法,即用n去减m,一直减到不能再减为止。
结果:这种算法只利用了高精度减法,所以代码实现难度较低。但m远远大于n时(eg:9999÷3),运算时间过长。因此不可取。
思路2:模拟除法竖式
这种解法比较容易想到,也符合认知规律,重点在于解决2个问题:
1.如何进行某一位置的除法;
2.如何把上一次的余数加入这次的计算。
关于问题1,我们发现,此时的除法,除数与被除数位数相差不多(商不会超过9),因此可用减法来模拟。
while ( 比较得被除数>除数)
{减一次;商++;
}
关于问题2,我的解决方法是用 head和tail作为指针,划出被除数的范围。

模拟竖式

在某种意义上,把被除数m [ ] 当成了一个队列,队头为0时,队头向后推。除到不能再除时,队尾的后移一位。
为了表示方便,我们最好不要像平时做高精度一样,把个位记为m[1],十位记为m[2]……而是按照数字输入的顺序,最高位的为m[1],次高位为m[2]……
伪代码:
int head=1,tail 1=n[0] ; ans[0]=1
while (tail<=m[0])
{
while (比较被除数与n前者大)
{在head到tail的范围内减一次;更新head值;
ans [ans[0]]++
}
ans [0]++;tail++
}
输出ans
但这样做出来后,只能得5分,原因是:因为得数的前与后都有可能出现0,只需在循环外或输出前判断一下即可。如果输入的被除数小于除数,直接得0。

#include<iostream>
#include<cstring>
#include<cstdio>
char n1[101],m1[101];
int m[101],n[101],ans[101],head,tail;
using namespace std;

bool start(int a[],int b[])//-----------------------start
{
 if(a[0]>b[0]) return 1;
 if(a[0]<b[0]) return 0;
 if(a[0]==b[0])
  for(int i=1;i<=a[0];i++)
  {
    if(a[i]>b[i]) return 1;
    if(a[i]<b[i]) return 0;
  } 
 return 1;  
}
void in(char a1[],int a[])
{ 
 gets(a1);
 a[0]=strlen(a1);
 for(int i=0;i<a[0];i++)
 a[i+1]=a1[i]-48;       
}
void out(int ans[])//------------------------------------out
{
 int h=1;
 while(ans[h]==0) h++;  
 for(int i=h;i<=ans[0];i++)
  cout<<ans[i];     
}
bool cmp(int a[],int b[])//--------------------------------cmp
{
    if(tail-head+1>b[0]) return 1;
    if(tail-head+1<b[0]) return 0;
    if(tail-head+1==b[0])
    for(int i=0;i<b[0];i++)
    {
     if(a[head+i]>b[i+1]) return 1;
     if(a[head+i]<b[i+1]) return 0;     
    }
 return 1;      
}
void jian(int a[],int b[])//---------------------- 减一次 
{
 int i=0;
 while(i<b[0])
  {
   if(a[tail-i]<b[b[0]-i])
    {a[tail-i]+=10; a[tail-i-1]--;} 
   a[tail-i]-=b[b[0]-i]; 
   i++;
  }
   while(a[head]==0) head++;    
}
void work(int a[],int b[])//----------------------------work
{
 head=1; tail=b[0]; ans[0]=1;
while(tail<=a[0])//--------------------------从后往前 
 {
  while(cmp(a,b)==1)//----------------------减多次 
   {
    jian(a,b);
    ans[ans[0]]++;
   }
  ans[0]++;
  tail++;   
 }
 if(ans[ans[0]]==0) ans[0]--;
}
int main()//---------------------------------------main
{
 in(m1,m);
 in(n1,n);
 if (start(m,n)==0)
  {
   cout<<0;
   return 0;    
  }
 work(m,n);
 out(ans);
 return 0;  
}

优化:用分治算法,把被除数拆成几部分,分别除。

高精度算法【加减乘除】 高精度加减乘除算法的讲解 阅读详情

相关推荐

C语言高精度算法(加、减、乘、阶乘、高除以高,高除以低)

高精度算法

qq_65265649的博客 7585

【基础算法】高精度除法

用途 准确无误地得出两大数相除后地余数和商 除法核心1【高精度除以低精度】 算法核心:逐位试商法 ①从被除数的第一位开始,用此数除以除数,得出商和余数 ②用得出的余数与被除数的下一位数字结合继续除以除数,以此类推 代码实现 #include <bits/stdc++.h> using namespace std; const int num=1e5; char ca[num]; int a[num],b,c[num]; void demo(char n1[],int n

m0_54566774的博客 7603

[蓝桥杯训练]———高精度乘法、除法

在计算机科学中,高精度算法通常指的是处理超过计算机原生数据类型表示范围的数字的能力。例如,如果要处理非常大或非常小的整数或小数,可能需要使用高精度算法,因为标准的整数和浮点数类型的表示范围是有限的。通常存在两种1.大整数高精度2.浮点型高精度。

m0_74939592的博客 1919

【7. 高精度除法】

高精度除法

小呆鸟blog 1586

(C语言)高精度除法

题目描述 高精度除法:给定一个很大很大的数字,用它来除以一个 int 或 long 范围内的整数。  输入 输入包括多组测试数据。 对每组测试数据,在一行中给出一个整数N(0 输出 对每组输入数据, 在一行中输出 N 除以 d  的结果(N/d). 如果被除数 N 不为零,除数d为0 ,则输出"Inf" (不包含引号," 'Inf' refers to

YiMo_Fan的博客 6616

C++从入门到入土-高精度除法

PS:爱c++爱未来一、高精度除以低精度采取按位相除法。#include&lt;cstdio&gt; #include&lt;iostream&gt; using namespace std; const int maxn=1010; char a1[maxn],c1[maxn]; int a[maxn],c[maxn],x=0,b,lena,lenc,i; int main() { freop...

这只小熊长得可真东西 1万+

C++ 的高精度除法

为什么需要高精度计算 对于 C++ 而言,最大的数据为 long long(64b,8位),对于超过 8B 的数据,C++ 没有对应的数据类型进行表示。所以我们需要知道高精度计算。更详细的解释,可以参考这个网页https://blog.youkuaiyun.com/justidle/article/details/104414459。 高精度除法计算原理 在读小学时,我们做除法都采用竖式方法计算。被除数...

努力中的老周的专栏 1万+

TwinCAT3 Modbus-TCP Client/Server使用

/起始地址是12289//起始地址是12294。

panjinliang066333的博客 7733

高精度除法的实现

这是C++算法基础-基础算法专栏的第十篇文章,详细讲解了高精度除法的定义、过程、性质、代码实现等内容。

wyuchen123的博客 935

qt实现程序密钥注册功能,MD5加密+AES加密,并实现一台电脑系统一个密钥

qt实现了一个给自己软件加密的功能。 原理是: 需要被注册的软件第一次运行的时候,在系统的注册表里面注册一个键值,如下: 这个值作为生成密钥的用户识别号,然后生成密钥文件key.db,把这个key.db文件放到软件执行目录下,即可完成软件的注册并正常使用软件。 软件第一次打开的界面及密钥生成工具软件界面如下: 将密钥生成工具软件生成的key.db放到软件执行目录下之后,软件即可正常使用,如下图: 代码使用了MD5加密 外加 AES加密, 解密和加密的核心代码如下: QSt.

weixin_43935474的博客 4128

别再到处找密钥了!手把手教你搞定Halcon 24.11/25.05的试用授权(附每月更新提醒)

本文详细介绍了Halcon 24.11/25.05试用授权的获取与配置方法,包括解密新版授权机制、快速配置指南、每月更新规律及多版本共存管理技巧。帮助开发者避免常见授权问题,提升工作效率,特别适合机器视觉领域的初学者和专业人士。

weixin_29238147的博客 1154

高精度算法——高精度除法

高精度除法是最后一个高精度运算了,也就是你学完了这一节,以后碰到了要用高精度算法的题都可以做了,好了,其他的我就不多说了。

m0_62999279的博客 2328

HDR标准核心参数全解析:从PQ/HLG到元数据,一篇搞懂技术选型

本文全面解析HDR标准的核心参数,包括PQ/HLG传输函数和元数据机制,帮助读者理解技术选型的关键因素。通过对比主流HDR标准的技术细节,提供从内容创作到硬件适配的实用指南,助力实现更真实的视觉体验。

weixin_31766003的博客 300

C语言——高精度除法

这里我们要实现大数除以小数,实际原理其实是模拟我们手算除法:与高精度加减乘法不同的是,高精度除法是从高位开始运算,一步一步运算到最低位的,所以不用将被除数字符串反转。

Stewie Lee的博客 3692

应急响应之windows日志分析工具logparser使用

windows日志分析工具logparser使用介绍

u013930899的博客 8123

YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml

全网最详细的YOLOv5源码解读之配置文件yaml。逐行注释,逐句讲解,一文带你了解yaml。小白必看!

路人贾的博客 1万+

C++ 大整数运算 高精度除法

这篇文章主要是对于大整数类的设计过程中,如何实现并改进长除法(模拟竖式法)的一个总结。

weixin_44215992的博客 5047

2023华为od机试C卷【最富裕的小家庭】Java&Go 实现

在一颗树中,每个节点代表一个家庭成员,节点的数字表示其个人的财富值,一个节点及其直接相连的子节点被定义为个小家庭。现给你一颗树,请计算出最富裕的小家庭的财富和。

MISAYAONE的博客 1902

高精度乘、除法

A5 A4 A3 A2 A1 A0 × b ————————————————

weixin_60569662的博客 573

光伏微电网蓄电池储能控制系统设计及动态性能分析

本文构建了光伏微电网蓄电池储能控制系统的完整理论体系。在系统架构方面,提出了基于直流母线电压平衡的多时间尺度能量管理理论,建立了光伏发电单元的二阶物理模型和MPPT动态跟踪算法。针对蓄电池系统,设计了融合二阶RC等效电路与扩展卡尔曼滤波的SOC估计方法,误差控制在3%以内。双向DC-DC变换器采用状态空间平均建模方法,推导了小信号传递函数,为闭环控制提供理论基础。该体系实现了从瞬时功率平衡到长期能量调度的多层级协同控制,为微电网稳定运行提供了系统的解决方案。

AI的内部世界的博客 191

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基础算法 —— 高精度计算 —— 高精度除法

【高精除以低精】 1.算法分析 做除法时,每一次的商的值都在0~9,每次求得的余数连接以后的若干位得到新的被除数,继续做除法。因此在做高精度除法时,要涉及到乘法运算和减法运算以及移位处理。 为程序简洁,可以避免高精度乘法,用0~9次循环减法取代得到商的值,对于高精度数除以低精度数,我们采用按位相除法。 2.模版 #include<iostream> #include<...

Alex_McAvoy的博客 8828

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

下一篇: 一个小练习
「已注销」
博客等级 码龄10年 2粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值