蓝桥杯 算法提高 P1001

策略是分块乘法(参照这篇帖子讲的非常详细 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;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值