10023 - Square root
来源:互联网 发布:好看的泳衣知乎 编辑:程序博客网 时间:2024/05/16 12:03
描述:这道题虽然是开方题,可是数据量却相当的大,可达1000位,不得不用大数来做#include <cstdio>#include <cstring>int n,m,flag,t;char s[1010],v[1010];int sum[1010],p[1010];int l_sum,l_p;bool com(){ for(int i=0; i<l_sum; ++i) if(sum[i]>p[i]) return 0; else if(sum[i]<p[i])return 1; else continue; return 1;}void sub(){ int flag=-1,len=l_sum-1; for(int i=l_p-1; i>=0; --i) { if(p[i]>=sum[len]) p[i]-=sum[len]; else { for(int j=i-1; j>=0; --j) if(p[j]) { --p[j]; for(int k=j+1; k<i; ++k) p[k]=99; break; } p[i]=p[i]+100-sum[len]; } --len; if(len<0) break; } for(flag=0; flag<l_p; ++flag) if(p[flag]>0) break; if(flag>0) { len=0; for(int i=flag; i<l_p; ++i) p[len++]=p[i]; l_p=len; }}void add(){ int flag=2; for(int i=l_sum-1; i>=0; --i) if(sum[i]+flag>99) { s[i]=(s[i]+flag)%100; flag=1; } else { sum[i]+=flag; return; } for(int i=l_sum; i>=1; --i) sum[i]=sum[i-1]; sum[0]=flag; ++l_sum;}void solve(){ int flag=0,c=0; for(int i=l_sum-1; i>=0; --i) { c=(sum[i]*10+flag)/100; sum[i]=(sum[i]*10+flag)%100; flag=c; } if(flag>0) { for(int i=l_sum; i>=1; --i) sum[i]=sum[i-1]; sum[0]=flag; ++l_sum; } c=9; int i=l_sum-1; if(sum[i]<c) { for(int j=i-1; j>=0; --j) if(sum[j]) { --sum[j]; for(int k=j+1; k<i; ++k) sum[k]=99; sum[i]=sum[i]+100-c; break; } } else sum[i]-=c; if(sum[0]<=0) { for(i=1; i<l_sum; ++i) sum[i-1]=sum[i]; --l_sum; }}void che(){ int flag=0; for( ; flag<l_p; ++flag) if(p[flag]>0) break; if(flag>0) { int len=0; for(int i=flag; i<l_p; ++i) p[len++]=p[i]; l_p=len; }}int main(){ // freopen("a.txt","r",stdin); // freopen("c.txt","w",stdout); scanf("%d",&t); while(t--) { scanf("%s",s); n=strlen(s); m=0; l_p=l_sum=sum[0]=1; int i; if(n%2==1) p[0]=s[0]-'0',i=1; else p[0]=(s[0]-'0')*10+s[1]-'0',i=2; while(1) { v[m]='0'; while(1) { if(l_p>l_sum||(l_p==l_sum&&com())) { sub(); v[m]++; add(); } else break; } che(); v[++m]=0; if(i+1<n) { p[l_p++]=(s[i]-'0')*10+s[i+1]-'0'; i+=2; } else break; solve(); } puts(v); if(t) puts(""); } return 0;}