若我们只考虑求解相除的商。
高精除低精
过程分析
所谓高精除低精指的是被除数值特别的大,除数值的范围在int类型范围内。
在模拟开竖式的过程当中,可以发现,除法和加、减、乘不一样,他是从高位开始计算的。所以,除法是不需要进行倒置存放的。过程当中我们也能发现,每一次都是将之前计算的余数和后面的数字结合成新的数字再进行除法计算。
int x=0;//存储余数
for(int i=0;i<l;i++){
//组成新的数字
x=x*10+a[i];
//除法计算
ans[i]=x/b;
x=x%b;
}
最后进行输出时,从前往后进行输出即可,注意下将前导0去除掉。
完整代码
#include <iostream>
#include <cstring>
using namespace std;
int main(){
char s1[50005]={0};
int a[50005]={0},ans[50005]={0};
int b;
cin>>s1>>b;
int l=strlen(s1);
for(int i=0;i<l;i++){
a[i]=s1[i]-'0';
}
int x=0;//存储余数
for(int i=0;i<l;i++){
//组成新的数字
x=x*10+a[i];
//除法计算
ans[i]=x/b;
x=x%b;
}
//输出,去除前导0
bool flag=false;
for(int i=0;i<l;i++){
if(ans[i]!=0||i==l-1){
flag=true;
}
if(flag){
cout<<ans[i];
}
}
return 0;
}
拓展
若进行两个大数进行相除又该如何处理呢?之前的解题思路就不再合适了。 17 ÷ 3 = 5 ⋯ 2 17\div 3 =5 \cdots2 17÷3=5⋯2 可以理解成5个3和一个2组合成了17。若我们要求出他们的商,只需求出17最多有几个3组成。我们可以用减法来对除法进行模拟,将被除数不断地减去除数,答案称为下一轮地被除数,直到被除数小于除数位置,循环次数即我们寻找的商。
给出伪代码:
//cmp(int a[],int b[]) 比较a,b所代表数字的大小,a<b即返回-1
//bidNumMinus(int a[],int b[]) 两个大数相减,并把结果更新至a中
while(cmp(a,b)>=0){
bigNumMinus(a,b);
ans++;
}
cout<<ans;