高精度除以高精度

讓咱們一塊兒聽着馬克西姆的Still Water走進IT天堂…
沉默的雨,無聲勝有聲;逗人的雨,真叫人喜悅。能夠沒必要穿雨衣,在戶外躑躅漫步,雨似蜜似酒,滋潤着心靈。雨,好像是千萬支魔指,好像是千萬條琴絃,彈出了變幻無窮的聲音。
廢話過多,讓咱們走進正題吧…python

題目描述
給出正整數N和M,請你計算N div M(N/M的下取整)。ios

輸入格式
兩行,兩個正整數,N和M。c++

輸出格式
一行,一個整數,表示N div M。web

• 對於60%的數據:N,M ≤ 750!,答案≤ 7!。數組

• 對於100%的數據:N,M ≤ 6250!,答案≤ 13!。svg

看着這些莫名其妙的感嘆號,我不由拿出了計算器,6250×6249×6248×6247×…6244×6243=…
很明顯,數字太大了!
(爲何c++不像python同樣自帶高精度!!!!!!!)spa

說多話也沒用,上代碼!code

時間複雜度太高,不宜使用xml

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int a[100005]={0},b[100005]={0},ans[100005]={0},la,lb,lens,i,j,k;//a:被除數;b:除數;ans:商;la:被除數長度;lb:除數長度;lans:商長度i,j,k:循環用
char s1[100005]={0},s2[100005]={0};

int main()
{
	cin>>s1>>s2;//讀入
	la=strlen(s1);
	lb=strlen(s2);
	for(i=1;i<=la;i++)
	{
		a[i]=s1[i-1]-'0';
	}
	for(i=1;i<=lb;i++)
	{
		b[i]=s2[i-1]-'0';//將字符串轉換成數組
	}
	if(la<lb)//若是被除數比除數的長度短,直接輸出0
	{
		cout<<"0";
		return 0;
	}
	if(la==lb)//若是長度同樣,若被除數較小,一樣輸出0
	{
		for(i=1;i<=la;i++)
		{
			if(a[i]<b[i])
			{
				cout<<0;
				return 0;
			}
			else
			{
				if(a[i]>b[i])
				{
					break;
				}	
			}
		}
				
	}
	lens=la-lb+1;//把除法轉換成減法,不停地減,每減一次,對應位置的答案加一
	for(i=1;i<=lens;i++)
	{
		while(1)
		{
			for(j=i,k=1;j<=lb+i-1,k<=lb;j++,k++)
			{
				if(a[j]>b[k])//若是被除數的某位置先比除數大了,則能夠作減法,跳出循環
				{
					j=lb+1;
					break;
				}
				else
				{
					if(a[j]<b[k])//若是被除數的某位置先比除數小了,則不可作減法,跳出循環
					{
						break;//若兩數相同,則繼續循環判斷
					}
				}
			}
				
			if(j>lb)//若是能夠作減法
			{
				for(j=lb+i-1,k=lb;j>=i,k>=1;j--,k--)
				{
					if(a[j]-b[k]>=0)
					{
						a[j]-=b[k];//減法實現
					}
					else
					{
						a[j]+=10,a[j-1]--,a[j]-=b[k];//若是一個位置上的數小於零,則退位
					}
				}
				ans[i]++;
			}
			else//若是不能作減法
			{
				a[i+1]+=a[i]*10;//將最前一位的全部數所有退到下一位置的數上
				a[i]=0;//歸零
				break;//跳出減法循環
			}
		}
	}
	for(i=1;i<=lens;i++)
	{
		if(i==1&&ans[i]==0);//刪去前導0
		else
		{
			cout<<ans[i];
		}
	}
		
	return 0;
}

時間複雜度太高,不建議使用token

稻花香裏說豐年,聽取WA聲一片