PTA高精度除法
思路
-
转化:首先将两个字符数组A,B(逆序)转化为整数数组a,b。
-
取出数组a的长度记为
lena
,取出b数组的长度记为lenb
。且lena>lenb
-
把除法理解成多次的减法
-
进入循环
-
自高位向低位匹配相减
-
注意:在数组相减过程中是需要对是否减的了进行检测的。(直接相减会破坏被减数组的结构)
- 若是减不了还硬减的话,需要做还原处理
- 也可以先模拟一遍,将数组a的部分和数组b分别赋值给数组ta和数组tb,如果可以相减的话
- 注意:最高位有可能会涉及往高位借1,所以数组a的部分数组的长度比数组b的长度加一。
-
代码
include
include<stdio.h>
include<string.h>
using namespace std;
string sa,sb;
int a[10005],b[10005];
int ta[10005],tc[10005];
int c[10005];
int main()
{
cin>>sa>>sb;
int alen=sa.length();
int blen=sb.length();
for(int i=alen-1;i>=0;i--)
{
a[alen-i]=sa[i]-'0';
}
for(int i=blen-1;i>=0;i--)
{
b[blen-i]=sb[i]-'0';
}
for(int i=alen-blen+1;i>=1;i--)
{
/*
建立模拟数组ta,tb(其实就是数组b);
*/
for(int j=i;j<=i+blen-1+1;j++)
{
ta[j-i+1]=a[j];
}
//用相减模拟相除
int flag=1;
while(flag)
{
for(int k=1;k<=blen;k++)
{
//新建的数组减掉减数
if(ta[k]-b[k]<0)//错了一下
{
//这里可能发生不断向高位借一
int cur=k+1;
ta[k]=ta[k]-b[k]+10;
ta[k+1]--;
while(ta[cur]<0&&cur<blen+1)//注意不要帮高位做加减,而是单纯的借位罢了
{
ta[cur+1]--;
ta[cur]+=10;
cur++;
}
if(ta[blen+1]<0)
flag=0;
}
else
ta[k]=ta[k]-b[k];
}
//如果可以被减的话
if(flag)
{
// //用ta覆盖a
for(int j=i;j<=i+blen-1+1;j++)
{
a[j]=ta[j-i+1];
}
//答案数组
c[i]++;
}
else
{
break;
}
}
}
int clen=alen;
while(c[clen]==0)
clen--;
for(int i=clen;i>=1;i--)
{
cout<<c[i];
}
return 0;
}