7 高精度除法

给两个正整数 a,b,求 a/b的整数部分。
输入格式:

输入共两行,每行一个正整数,分别表示 a和b。 50%数据,a,b均小于1e18, 50%数据,a,b均小于1e500。
输出格式:

输出一个整数,表示a/b的整数部分。
输入样例1:

3
2

输出样例1:

1

输入样例

24781236498237462378425347823652387423654238752372365327862
8934457724628746

输出样例2:

2773669903874014740488146558678531750078864

#include<bits/stdc++.h>
using namespace std;
struct bign{
	int d[1000];
	int len;
	bign(){
		memset(d,0,sizeof(d));
		len=0; 
	} 
};
string simple(string s){
	int i;
	for(i=0;i<s.length();i++){
		if(s[i]!='0')	break;
	}
	s.erase(s.begin(),s.begin()+i);
	return s;
}
bign change(string s){
	bign a;
	a.len=s.length();
	for(int i=0;i<a.len;i++){
		a.d[i]=s[a.len-i-1]-'0';
	}
	return a;
}
int comp(bign a,bign b){
	if(a.len>b.len)	return 1;
	else if(a.len<b.len)	return -1;
	else{
		for(int i=a.len-1;i>=0;i--){
			if(a.d[i]>b.d[i])	return 1;
			else if(a.d[i]<b.d[i])	return -1;
		}
		return 0;
	}
}
bign sub(bign a,bign b){
	bign c;
	for(int i=0;i<a.len||i<b.len;i++){
		if(a.d[i]<b.d[i]){
			a.d[i+1]--;
			a.d[i]+=10;
		}
		c.d[c.len++]=a.d[i]-b.d[i];
	}
	while(c.len>=2&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}
bign divide(bign a,bign b){
	bign c,r;//c答案,r余数 
	c.len=a.len;
	for(int i=a.len-1;i>=0;i--){
		//余数数组右移一位,最低位放a.d[i]
		r.len++;
		for(int j=r.len-1;j>0;j--){
			r.d[j]=r.d[j-1];
		}
		r.d[0]=a.d[i];
		while(r.len>=2&&r.d[r.len-1]==0){//
			r.len--;
		}
		if(comp(r,b)<0)	c.d[i]=0;
		else{
			while(comp(r,b)>=0){
				c.d[i]++;
				r=sub(r,b);
			}//这里会莫名加到50,原因是余数r也要去除前导0,鬼知道为什么 
		}
	}
	while(c.len>=2&&c.d[c.len-1]==0){
		c.len--;
	}
	return c;
}
int main(){
	string t1,t2;
	cin>>t1>>t2;
	t1=simple(t1);t2=simple(t2);
    if(t1==t2){
        cout<<1;
        return 0;
    }
	bign a=change(t1),b=change(t2);
	bign c;
	c=divide(a,b);
	for(int i=c.len-1;i>=0;i--){
		cout<<c.d[i];
	}
	return 0;
}
发布了23 篇原创文章 · 获赞 8 · 访问量 1362

猜你喜欢

转载自blog.csdn.net/qq_45550552/article/details/104722406