这是我在2020年4月12日发布在洛谷上的一篇博客,今天把它搬运到CSDN里来
//在正式开始之前,我们先来理一下思路,因为除数和被除数都太大了,所以我们不可以用正常的“/”来解决
//那怎么办呢?因为除法是减法的高级运算,所以我们可以转变成低级的减法,那么就是被除数一直减除数,直到减不了为止
//但是这些数太大了,如果这样做会太慢,那我们就在想想除法的竖式
//我们以100/5为例 :
/*
首先,100首位1除以5,不行
然后,往后加一位,10/5=2,商在第一个0的上面
最后,最后一位是0,不用管,直接他的头顶上商0
*/
//既然我们要尽量不减少内容,那我们就干脆给除数加0加的和被除数一样(虽然有加的可能比被除数大,但是减法函数会处理的,后面有体现),最后最后把商商到对应位就可以了
#include<cstdio>
#include<iostream>
#include<cstring>//头文件
using namespace std;//命名空间
int jianfa(int *p1,int *p2,int len1,int len2){
//函数:减法,大整数减法函数,附带是否可减判断 ,返回内容:不可减返回-1否则返回答案长度,答案存在p1里
//p1:数字1,p2:数字2,len1、2:长度1、2
if(len1<len2){
return -1;//如果p2长度比p1长(p2比p1大),那么首先不能减,返回-1
}
if(len1==len2){
//如果长度一样
for(int i=len1-1;i>=0;i--){
//一个一个判断
if(p1[i]>p2[i]){
//如果出现第一个不一样的数字p1[i]比p2[i]大(p1大于p2)那么就直接退出,说明可以减
break;//退出
}else if(p1[i]<p2[i]){
//如果出现第一个不一样的数字p2[i]比p1[i]大(p2大于p1)那么就直接返回-1,说明不能减
return -1;//返回-1
}
}
}
//两个数经历上面的磨炼都确定可以减了,那么下面就开始吧~
for(int i=