高精÷高精的代码

#include<bits/stdc++.h>
using namespace std;
int a[10000000],b[10000000],c[10000000],ans[10000000];
bool stringcmp(string a,string b){
	if(a.size()<b.size()) return 1;
	if(a.size()>b.size()) return 0;
	if(a<b) return 1;
	else return 0;
}
string stringminus(string a,string b){
	string ans;
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	int down=0;
	for(int i=0;i<max(a.size(),b.size());i++){
		down+=a[i]-48;
		if(i<b.size()) down-=b[i]-48;
		ans=char((down+10)%10+48)+ans;
		down=((down+10)/10-1);
	}
	int len=0;
	while(ans[len]=='0'){
		len++; 
	} 
	return ans.substr(len,ans.size()-len+1);
}
int main(){
	string as,bs,cmpa;
	cin>>as>>bs;
	//输入两个大整数 
	if(as=="0"){
		cout<<0;
		return 0;
	} 
	//特判 
	for(int i=1;i<=as.size();i++){
		a[i]=as[i-1]-48;
	} 
	for(int i=1;i<=bs.size();i++){
		b[i]=bs[i-1]-48;
	} 
	for(int cmpai=0;cmpai<bs.size();cmpai++){
		cmpa+=a[cmpai+1]+48;
	}
	//正序隔位转存到整型数组里
	for(int i=1;i<=as.size()-bs.size()+1;i++){
		string cmpb,cun="0";
		for(int ch=1;ch<=10;ch++){
			fill(c,c+10000,0);
			for(int j=bs.size();j>0;j--){
				c[j]+=b[j]*ch;
				c[j-1]+=c[j]/10;
				c[j]%=10;
				cmpb=char(c[j]+48)+cmpb;
			}
			cmpb=char(c[0]+48)+cmpb;
			int len=0;
			while(cmpb[len]=='0'){
				len++; 
			} 
			cmpb=cmpb.substr(len,cmpb.size()-len);
			if(stringcmp(cmpa,cmpb)){
				ans[i-2+bs.size()]=ch-1;
				break;
			}
			cun=cmpb; 
			cmpb=""; 
		}
		//记录商
		cmpa=stringminus(cmpa,cun);
		cmpa+=a[i+bs.size()]+48;
		//减法 
	}
	int len=0;
	while(ans[len]==0){
		len++; 
	} 
	for(int i=len;i<as.size();i++){
		cout<<ans[i];
	}
	return 0;
}

可能有些地方写的比较史,嗯对。 然后没了

求夸奖

3 条评论

  • 1