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  阅读(46)  评论(0编辑  收藏  举报