蓝桥杯 算法提高 P1001

来源:互联网 发布:淘宝食品类目有哪些 编辑:程序博客网 时间:2024/04/30 04:36

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


0 0