|
|
back to boardWhy when I submit this program server write Running 0.02s 106kb for so long time (>20 min)I suppose that this action is incorrect #include<iostream.h> #include<string.h> #define MAX 2000 int srav(int a[MAX+100],int b[MAX+100]); int sqr(); int pr[MAX+100],result[MAX+100]; void main(){ char str[MAX+100]; int t,j,p[MAX+100],q[MAX+100],mass[MAX+100]; for(int i=0;i<MAX;i++) { mass[i]=0; str[i]=0; p[i]=0; q[i]=0; } cin >> str; //for(i=MAX-1;i>=0;i--) // if(str[i]) int pm=strlen(str); if((pm==1)&&(str[0]=='0')) { cout << 0; return ; } for(i=0;i<pm;i++) mass[i]=int(str[pm-i-1])-48; int l=0; for(i=0;i<MAX;i++) { t=mass[i]; mass[i]=(t*2+l)%10; l=(t*2+l)/10; } for(i=MAX-1;i>=0;i--) if(mass[i]!=0) { pm=i+1; break; } q[pm/2+1]=1; while(srav(p,q)==1) { for(i=MAX-1;i>=0;i--) pr[i]=0; l=0; for(i=0;i<MAX;i++) { pr[i]=(p[i]+q[i]+l)%10; l=(p[i]+q[i]+l)/10; } for(i=MAX-1;i>=0;i--) if(pr[i]!=0) { for(j=i;j>0;j--) { if(pr[j]%2!=0) pr[j-1]+=10; pr[j]/=2; } pr[0]/=2; break; } l=sqr(); if(l>pm) for(i=0;i<MAX;i++) q[i]=pr[i]; if(l<pm) for(i=0;i<MAX;i++) p[i]=pr[i]; if(l==pm) { if(srav(result,mass)==1) for(i=0;i<MAX;i++) p[i]=pr[i]; if(srav(result,mass)==0) break; if(srav(result,mass)==-1) for(i=0;i<MAX;i++) q[i]=pr[i]; } } for(i=MAX-1;i>=0;i--) if(pr[i]!=0) { for(j=i;j>=0;j--) cout << pr[j]; break; } } int srav(int a[MAX],int b[MAX]){ for(int i=MAX-1;i>=0;i--) { if(a[i]<b[i]) return 1; if(a[i]>b[i]) return -1; } return 0; } int sqr(){ int l,i,j,t; for(i=MAX-1;i>=0;i--) if(pr[i]!=0) { l=i+1; break; } for(i=MAX-1;i>=0;i--) result[i]=0; for(i=0;i<l;i++) for(j=0;j<l;j++) if(i+j<MAX-5) { t=pr[i]*pr[j]; result[i+j]+=t; } else return MAX+200; l=0; for(i=0;i<MAX-1;i++) { t=result[i]; result[i]=(result[i]+l)%10; l=(t+l)/10; } if(l!=0) return MAX+200; l=0; for(i=0;i<MAX;i++) { t=result[i]; result[i]=(l+result[i]+pr[i])%10; l=(l+t+pr[i])/10; } if(l!=0) return MAX+200; for(i=MAX-1;i>=0;i--) if(result[i]!=0) return i+1; return 0; } |
|
|