分析:高精除以高精则是用减法模拟除法,对被除数的每一位都减去除数,一直减当前位置的数字(包含前面的余数)小于除数(由于每一位的数字小于10,所以对于每一位最多进行10次计算)
这里由于另一位博主的博客写的更加优秀,于是推荐大家去她那里学习,这是链接:高精除以高精_高精除高精-CSDN博客
#include<iostream>
#include<cstring>
using namespace std;
int a[101],b[101],c[101],d,i;
void init(int a[]){//获取字符串 并将字符串逆向存储转换为数组
string s;
cin>>s;
a[0]=s.length();//a[0]储存字符串的长度
for(i=1;i<=a[0];i++)
a[i]=s[a[0]-i]-'0';
}
void print(int a[]){//打印函数 逆向输出
if(a[0]==0) {
cout<<0<<endl;
return ;
}
for(int i=a[0];i>0;i--) cout<<a[i];
cout<<endl;
return ;
}
int compare(int a[],int b[]){//比较函数 a>b返回1;a<b返回-1;a=b返回0
if(a[0]>b[0]) return 1;
if(a[0]<b[0]) return -1;
for(int i=a[0];i>0;i--){//从高位向低位比较
if(a[i]>b[i]) return 1;
if(a[i]<b[i]) return -1;
}
return 0;//每一位都相等
}
void jian(int a[],int b[]){
int flag,i;
flag=compare(a,b);
if(flag==0) {a[0]=0;return;}
if(flag==1){
for(i=1;i<=a[0];i++){
if(a[i]<b[i]){//处理借位
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while(a[0]>0&&a[a[0]]==0) a[0]--;//修正位数
return;
}
}
void numcpy(int p[],int q[],int det){//将p数组拷贝到q数组中,从q的det位置开始
for(int i=1;i<=p[0];i++)q[i+det-1]=p[i];
q[0]=p[0]+det-1;//更新q的位数
}
void chu(int a[],int b[],int c[]){//除法运算函数
int i,tmp[101];
c[0]=a[0]-b[0]+1;//确定商的位数
for(i=c[0];i>0;i--){
memset(tmp,0,sizeof(tmp));
numcpy(b,tmp,i);
while(compare(a,tmp)>=0){//减法模拟除法运算过程
c[i]++;
jian(a,tmp);
}
}
while(c[0]>0&&c[c[0]]==0) c[0]--;
return ;
}
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
init(a);
init(b);
chu(a,b,c);
print(c);
print(a);
return 0;
}