策略是分块乘法(参照这篇帖子讲的非常详细 http://blog.csdn.net/acmman/article/details/20830555),要做的就是根据输入的位数调整进制,需要一点技巧,这里用的是把数字转字符串判断长度,当然还有更好的办法因人而异哪个顺手用哪个。
#include<iostream>
#include<sstream>
using namespace std;
//数字转字符串
string Int_to_String(int n)
{
ostringstream stream;
stream<<n;
return stream.str();
}
int main(int argc, char* argv[])
{
int R[4];
int a,b,M;
cin>>a;
cin>>b;
//千万别忘了这个不然只有83分最后一组用例过不去 (别问我怎么知道的)
if(a==0||b==0)
{
cout<<"0";
return 0;
}
//把数字转成字符串判断位数用于确定M的大小(进制)
string stra=Int_to_String(a);
int len=stra.length();
switch(len)
{
case 2:
{
M=10;
break;
}
case 3:
{
M=10;
break;
}
case 4:
{
M=100;
break;
}
case 5:
{
M=100;
break;
}
case 6:
{
M=1000;
break;
}
case 7:
{
M=1000;
break;
}
case 8:
{
M=10000;
break;
}
}
//分块乘法
int n1,n2,n3,n4;
int x1,x2,y1,y2;
x1=a%M;
x2=a/M;
y1=b%M;
y2=b/M;
n1=x1*y1;
n2=x1*y2;
n3=x2*y1;
n4=x2*y2;
R[3]=n1%M;
R[2]=n1/M+n2%M+n3%M;
R[1]=n2/M+n3/M+n4%M;
R[0]=n4/M;
//校对近位
R[1]=R[1]+R[2]/M;
R[2]=R[2]%M;
R[0]=R[0]+R[1]/M;
R[1]=R[1]%M;
cout<<R[0]<<R[1]<<R[2]<<R[3];
return 0;
}