提交记录 9336


用户 题目 状态 得分 用时 内存 语言 代码长度
oscar_test 1004a. 【模板题】高精度乘法2 Time Limit Exceeded 0 1 s 180 KB C++ 2.19 KB
提交时间 评测时间
2019-05-01 16:38:24 2020-08-01 01:36:47
#include<iostream>
#include<algorithm>
using namespace std;

//must fulfil ina >= inb, otherwise "Error" pop out

string lSub(const string& ina,const string& inb){
	string a=ina,b=inb;
	
	while(a.size()!=b.size())
		a.size()>b.size() ? b.insert(b.begin(),'0') : a.insert(a.begin(),'0');
	
	string ans;
	int sub,num,app=0;
	
	for(int i=a.size()-1;i>=0;i--){
		sub=a[i]-b[i]-app;
		num=(10+sub)%10;
		ans.push_back('0'+num);
		app= sub<0 ? 1 : 0;
	}
	
	if(app) cout<<"Error in lSub: ina < inb !"<<endl;
	
	int r=ans.size();
	while(--r>0&&ans[r]=='0') ans.pop_back();
	
	reverse(ans.begin(),ans.end());
	
	return ans;
}


//To implement lMul: lAdd is reused

string lAdd(const string& ina,const string& inb){
	string a=ina,b=inb;
	
	while(a.size()!=b.size())
		a.size()>b.size() ? b.insert(b.begin(),'0') : a.insert(a.begin(),'0');
	
	string ans;
	int sum,num,app=0;
	
	for(int i=a.size()-1;i>=0;i--){
		sum=a[i]-'0'+b[i]-'0'+app;
		num=sum%10;
		ans.push_back('0'+num);
		app=sum/10;
	}
	
	if(app) ans.push_back('0'+app);
	
	int r=ans.size();
	while(--r>0&&ans[r]=='0') ans.pop_back();
	
	reverse(ans.begin(),ans.end());
	
	return ans;
}

string lMul(const string& ina,const string& inb){
	string b=inb,ans;
	
	for(int i=ina.size()-1;i>=0;i--){
		string rans;
		int pro,num,app=0;
		
		for(int j=b.size()-1;j>=0;j--){
			pro=(b[j]-'0')*(ina[i]-'0')+app;
			num=pro%10;
			rans.push_back('0'+num);
			app=pro/10;
		}
		
		if(app) rans.push_back('0'+app);
		
		int r=rans.size();
		while(--r>0&&rans[r]=='0') rans.pop_back();
		
		reverse(rans.begin(),rans.end());
		
		ans=lAdd(ans,rans);
		b.push_back('0');
	}
	
	return ans;
}


string llMul(const string& ina,const string& inb){
	if(ina.size()<10||inb.size()<10) return lMul(ina,inb);
	
	int n=min(ina.size(),inb.size());
	n-=n/2;
	
	string a0=ina.substr(0,ina.size()-n);
	string a1=ina.substr(ina.size()-n);
	string b0=inb.substr(0,inb.size()-n);
	string b1=inb.substr(inb.size()-n);
	
	string c0=llMul(a0,b0);
	string c2=llMul(a1,b1);
	
	string c1=lSub(lSub(llMul(lAdd(a0,a1),lAdd(b0,b1)),c0),c2);
	
	for(int i=0;i<2*n;i++)
		c0.push_back('0');
	
	for(int i=0;i<n;i++)
		c1.push_back('0');
	
	return lAdd(lAdd(c0,c1),c2);
}


int main(){
	
	
	string a,b;
cin>>a>>b;
cout<<lMul(a,b)<<endl;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #11 s180 KBTime Limit ExceededScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-04 11:46:10 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠