大数除法,本人认为是我目前见过大数算法中最难的一个(仅仅是个人想法),它与之前的大数加法乘法减法不同,有些难理解,下面我一点一点的分析,讲解一下如何去实现大数除法。

首先,我们要知道除法中,存在四个常用名称,被除数,除数,商,余数(例如:53 / 8 = 6 余 5  ;其中53 为被除数,8为除数,6为商,5为余数 )当然我们可能会要求直接得到商,保留几位小数(如:53 / 8 = 6.625)我们可以发现实际上小数部分0.625就是余数除以除数的结果(5 / 8 = 0.625 ),所以在之后的讨论中,我们只讨论如何得到商和余数。

一般我们在做除法问题时,也就是说数据类型之内的数之间的除法运算,我们一般会这样去写:

#include<stdio.h>
int main()
{long long n,m,mer,rem;scanf("%lld %lld",&n,&m);if(n<m)   //被除数小于除数,商为0,余数为m{printf("商:0\n余数:%d\n",m);}if(n==m)  //两数相等,商为1,余数为0{printf("商:1\n余数:0\n");}if(n>m)   //被除数大于除数{for(int i=1;;i++){n=n-1;if(n%m==0){mer=n/m;rem=i;break;}}printf("商:%lld\n余数:%lld\n",mer,rem);}return 0;
}

这是除法的一般方法,我们在计算的时候,首先要考虑,输入的被除数是否比除数大,如果比除数小或者两数相等,那么就可以直接得到商和余数了,这就不用在解释了吧,如果被除数比除数大,那么我们就把被除数放循环里,每次减1,直到能与除数整除。这是常规做法,是有限制的,我们所遇到的数必须是long long类型以内的数,如果比long long 大,就没办法算了。怎么办呢???

下面步入正题。。。。

由之前大数加法减法乘法中,我们可以知道,我们将大数以字符串的形式输入,然后再转化为数字,下面我截取了这部分代码,我们可以看到,首先以字符串的形式输入两个大数,然后分别得出两个大数的位数,最后再利用数组去倒序存储字符串中的每一个元素,并转化为数字,比如我之前举例说明的 53 和 8 ,那么存到数组中就是 x[0]=3,x[1]=5;  y[0]=8;  当然你也可以不倒置,直接顺序读入,但是在后面的计算过程中就会有一些变化,比如说得到的结果,倒置之后得到结果要去除前导0,不倒置得到的结果要去除后缀0。

    while(~scanf("%s %s",a,b)){len1=strlen(a);//被除数位数len2=strlen(b);//除数位数for(i=len1-1,j=0;i>=0;i--)//将字符串中各个元素倒序储存在数组中{x[j++]=a[i]-'0';//a[i]-'0'的意思是:a[i]是一个字符,如果为'1',那么在ASCLL是49,而'0'是48 ,所以 49 - 48 = 1,就转化成了数字}for(i=len2-1,k=0;i>=0;i--){y[k++]=b[i]-'0';}

目前,我们要知道,在大数里我们已经不能再用刚才的常规方法去计算了,那怎么去计算呢?这就需要转一下脑子了,将刚才的除法思想转变为减法思想,举个栗子:(一般我们计算7除以2等于3余1( 7 / 2 = 3 余 1)),现在变成减法思想( 7 / 2 → 7 - 2 - 2 - 2 = 1 →减了3次,1比2小,不能再减了,即得到 7 / 2 = 3 余 1)怎么样?脑子转过来了吗?如果还不行,你再用其他例子试试,理解了再往下看

现在我们就将除法变成减法了(开始上车了),再用 550 和 24 拿过来举个栗子( 550-24-24-24-....-24 = 22)一共减了22次24,最后余22,你可能会说,这太暴力了吧,哈哈哈哈哈,当然不啊,下面请看下图:

( 550 / 24 = 22 余 22 )(开始开车了),通过上图,你发现了什么?商为22,我们减了4次24,百位数字减两次,十位数字减两次,最后余22,这就比开始我们减了22次要快多了吧。所以我们只需要使 被除数与除数位数相同,然后相减就可以了,(例如550 - 240 -240 - 24 - 24 = 22),位数不同时在除数后面补0。例如: 53 - 8,要用5-8,先补位,变成53-80,因为倒置了,即35-08,最后计算过后得到的结果是商为06,余数为05,去除前缀0 ,就得到最终结果了。

如果你理解了上面的思路,那么现在咱们来详细的分析一下大数除法的实现过程:

  1. 首先,要定义两个字符串来存储大数,另外还需要两个数组来转化之后的被除数,除数,并且再定义两个数组来存储商和余数。好了,开始输入两个大数,然后计算两个大数的位数,分别用len1,len2存储。之后开始将字符串转化为数字。
  2. 然后,我们就要判断利用位数的大小来判断被除数和除数的大小,如果len1<len2,显然被除数小于除数,就可以直接得出结果了,如果被除数的位数大于或者等于除数的位数,就无法直接判断大小了,下面就需要进行计算了。先将除数后补0,将两个大数位数相同,注意如何补0,我们一开始存的是x[0]=3;x[1]=5;y[0]=8;在8的前面补0。
  3. 然后就开始进入计算过程,首先初始化表示商的数组(z[ ]),然后就判断两个数之间的关系以及位数与除数位数的关系,满足条件,进行减法运算,若不满足条件,将除数位数减1,即去0,循环直到得出结果。

4.  对得到的结果进行去除前缀0操作,输出结果。

代码如下:

#include<stdio.h>
#include<string.h>char a[100],b[100];//用两个字符串用来输入两个大数int x[100],y[100],z[100],m[100];//被除数  除数  商  余数int digit;  //大数的位数void sub(int x[],int y[],int len1,int len2)//大数减法
{int i;for(i=0;i<len1;i++){if(x[i]<y[i]){x[i]=x[i]+10-y[i];x[i+1]--;}elsex[i]=x[i]-y[i];}for(i=len1-1;i>=0;i--)//判断减法结束之后,被除数的位数{if(x[i]){digit=i+1;break;}}
}
int judge(int x[],int y[],int len1,int len2)
{int i;if(len1<len2)return -1;if(len1==len2)//若两个数位数相等{for(i=len1-1;i>=0;i--){if(x[i]==y[i])//对应位的数相等continue;if(x[i]>y[i])//被除数 大于 除数,返回值为1return 1;if(x[i]<y[i])//被除数 小于 除数,返回值为-1return -1;}return 0;//被除数 等于 除数,返回值为0}
}
int main()
{int i,j=0,k=0,temp;int len1,len2,len;//len两个大数位数的差值while(~scanf("%s %s",a,b)){len1=strlen(a);//被除数位数len2=strlen(b);//除数位数for(i=len1-1,j=0;i>=0;i--)//将字符串中各个元素倒序储存在数组中{x[j++]=a[i]-'0';}for(i=len2-1,k=0;i>=0;i--){y[k++]=b[i]-'0';}if(len1<len2)//当被除数位数 小于 除数位数时{printf("商是:0\n");printf("余数是:");puts(a);}else //当被除数位数 大于或者等于 除数位数时{len=len1-len2;//两个大数位数的差值for(i=len1-1;i>=0;i--)//将除数后补零,使得两个大数位数相同。{if(i>=len)y[i]=y[i-len];elsey[i]=0;}len2=len1;//将两个大数数位相同digit=len1; //将原被除数位数赋值给digitfor(j=0;j<=len;j++){z[len-j]=0;while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数的大小以及被除数位数与除数原位数的关系{sub(x,y,len1,len2); //大数减法函数z[len-j]++;//储存商的每一位len1=digit;//重新修改被除数的长度if(len1<len2&&y[len2-1]==0)len2=len1;  //将len1长度赋给len2;}if(temp<0)//若被除数 小于 除数,除数减小一位。{for(i=1;i<len2;i++)y[i-1]=y[i];y[i-1]=0;if(len1<len2)len2--;}}printf("商是:");for(i=len;i>0;i--)//去掉前缀0{if(z[i])break;}for(;i>=0;i--)printf("%d",z[i]);printf("\n");printf("余数是:");for(i=len1;i>0;i--){if(x[i])break;}for(;i>=0;i--)printf("%d",x[i]);printf("\n");}}return 0;
}

大数加法:https://blog.csdn.net/ysz171360154/article/details/85006990

大数减法:https://blog.csdn.net/ysz171360154/article/details/88916100

大数乘法:https://blog.csdn.net/ysz171360154/article/details/88918627

大数除法——超详细讲解相关推荐

  1. Python的零基础超详细讲解(第七天)-Python的数据的应用

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  2. Python的零基础超详细讲解(第五天)-Python的运算符

    往期文章 Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博客-CS ...

  3. Python的零基础超详细讲解(第十三天)-Python的类与对象

    基础篇往期文章如下: Python的零基础超详细讲解(第一天)-Python简介以及下载 Python的零基础超详细讲解(第二天)-Python的基础语法1 Python的零基础超详细讲解(第三天)- ...

  4. Python的零基础超详细讲解(第十二天)-Python函数及使用

    基础篇往期文章: Python的零基础超详细讲解(第一天)-Python简介以及下载_编程简单学的博客-CSDN博客 Python的零基础超详细讲解(第二天)-Python的基础语法1_编程简单学的博 ...

  5. python高级语法装饰器_Python高级编程——装饰器Decorator超详细讲解上

    Python高级编程--装饰器Decorator超详细讲解(上篇) 送你小心心记得关注我哦!! 进入正文 全文摘要 装饰器decorator,是python语言的重要特性,我们平时都会遇到,无论是面向 ...

  6. mybatis-plus超详细讲解

    (6条消息) mybatis-plus超详细讲解_zdsg45的博客-CSDN博客_mybatis-plushttps://blog.csdn.net/zdsg45/article/details/1 ...

  7. stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解)

    stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解) 首先看看效果吧 手机端发送一个数据在OLED屏幕上显示 其实蓝牙通信就是个蓝牙转串口的过程,手机 ...

  8. Java基础18-String类【String类的特点对象个数常用方法】【超详细讲解】

    Java基础-String类[超详细讲解] String类的特点 String在java.lang.String包中 1:特点 (1)String类型不能被继承,因为由final修饰 (2)Strin ...

  9. react的超详细讲解

    create-react-app 项目目录 在HTML中使用react 1 2 3基础 React的注意事项 模拟的React 和 render React组件 函数组件 类组件 React 的数据源 ...

最新文章

  1. 创建图像 php,详解php创建图像具体步骤
  2. redux 入门到实践
  3. 12v60ah锂电池组装图_锂电池基本参数,结合电动自行车电池应用分析
  4. 【Android】Android 8种对话框(Dialog)
  5. 了解模型、视图和控制器
  6. 使用ASP.Net WebAPI构建REST服务(一)——简单的示例
  7. [Leetcode456]132模式 - 单调栈
  8. linux之切换用户su(switch user)
  9. python音频提取pcm_python pcm音频添加头转成Wav格式文件的方法
  10. Java爬虫框架Jsoup学习记录
  11. Excel数据导入sql临时表操作步骤
  12. T00LS专访白帽子:carry_your和带头大哥【T00ls人物专访第八期】
  13. java date 默认值_Java程序将java.util.Date转换为ZonedDateTime
  14. 机械能计算机实验教案,学生实验:用DIS研究机械能守恒教案3
  15. [Vue Router warn]
  16. ugui 转轮_Unity3D的FingerGesture插件
  17. OOC 面向对象C语言编程实践
  18. AviSynth 模拟Mplayer的遮标滤镜(Delogo)
  19. 微信小程序实现运动步数排名与发布个人动态服务器部署
  20. 雪花算法-java实现

热门文章

  1. Rails db rake命令
  2. 浩瀚抄码器冻品进口肉类抄重工具怎么用抄码器?抄码器如何用?便携式抄码器牛羊肉手持抄码器
  3. 架构系列---利用zookeeper 分布式锁解决缓存重建冲突实战
  4. 【Docker x Hadoop】使用 Docker 搭建 Hadoop 集群(从零开始保姆级)
  5. python 斗图图片爬虫
  6. Mac macOs Big Sur 版本11.2.3 解决安装了思科AnyConnect开机总是弹框提示安全移动客户端通知的问题
  7. 中国象棋python实现(拥有完整源代码) Alpha-beta剪枝+GUI+历史启发式+有普通人棋力
  8. MySQL OCP报考流程
  9. text pad java_错误:无法在Textpad 8中找到或加载主类
  10. 一键即可实现图片翻译成中文,多国语言任意选