Title

PTA高精度除法

PTA高精度除法

思路

  1. 转化:首先将两个字符数组A,B(逆序)转化为整数数组a,b。

  2. 取出数组a的长度记为lena,取出b数组的长度记为lenb。且lena>lenb

  3. 把除法理解成多次的减法

    1. 进入循环

    2. 自高位向低位匹配相减

    3. 注意:在数组相减过程中是需要对是否减的了进行检测的。(直接相减会破坏被减数组的结构)

      • 若是减不了还硬减的话,需要做还原处理
      • 也可以先模拟一遍,将数组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;
}

posted @ 2021-03-21 12:16  BeautifulWater  阅读(89)  评论(0)    收藏  举报