提交不過,自己測試對了,以後再看看
#include <iostream>#include <string>#include <cmath>using namespace std;void chenn(string &a,string b)//a=a*b{ int i,j,k,l,sum,c[410]={0}; l=a.length()+b.length(); for(i=b.length()-1;i>=0;i--) for(j=a.length()-1,k=i+j+1;j>=0;j--,k--) {sum=(b[i]-'0')*(a[j]-'0')+c[k];c[k]=sum%10;c[k-1]+=sum/10; } i=c[0]?0:1; while(a.length()<l-i) a=a+'0'; for(j=0;i<l;i++) a[j++]=(c[i]+'0');}int OK(string s1,int n) //s1和n的大小,1大了,0小了 {string s3=""; while(n){s3=(char)(n%10+'0')+s3; n/=10;}while(s3.length()<s1.length()) s3+='0';if(s1>s3) return 1;return 0;}string to_int2(string s2,int start){int i,sum=1,c; string ss;for(i=0;i<start;i++) s2[i]='0';while(sum&&ss.length()<150){c=0;for(i=s2.length()-1;i>=start;i--){int tt=c; c=(tt+(s2[i]-'0')*2)/10; s2[i]=(tt+(s2[i]-'0')*2)%10+'0'; }ss=ss+(char)(c+'0'); s2[start-1]=(char)(c+'0');//cout<<s2<<" "<<ss<<endl;//system("pause");for(sum=i=0;i<s2.length();i++) sum+=(s2[i]-'0');}return ss;}int main(int argc, char *argv[]){int t,n,i,j,L,R,M,start,temp; string s0,s1,s2;cin>>t;while(t--){cin>>n>>s0; s1=""; s2="";temp=start=(int)sqrt((double)n);if(temp*temp==n) while(s2.length()<150) s2+='0';else{start=(int)log10(start)+1;while(temp){s2=(char)(temp%10+'0')+s2;temp/=10;}while(s2.length()<150){L=0; R=9; s1=s2; while(L<R){M=L+(R-L+1)/2;s1=s2; s1+=(char)(M+'0');chenn(s1,s1);if(OK(s1,n)) R=M-1;else L=M;}s2+=(char)(L+'0');}//將s2小數部分轉化成二進位 s2=to_int2(s2,start);}cout<<s2.find(s0)<<endl;}return 0;}