求调!
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=5e5+10;
template<typename Tp> inline void read(Tp&x)
{
x=0;register bool z=true;
register char c=getchar();
for(;c<'0'||c>'9';c=getchar()) if(c=='-') z=0;
for(;'0'<=c&&c<='9';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
x=(z?x:~x+1);
}
int t,n;
char s[N],ans[N],sum[N],y[N],p[N];
int c[N],d[N],a[N],b[N],cj[N];
void mul(char a[],char b[])
{
memset(ans,0,sizeof(ans));
memset(cj,0,sizeof(cj));
memset(c,0,sizeof(c));
memset(d,0,sizeof(d));
int len=0;
if(a=="0"||b=="0")
{
y[0]='0';
return ;
}
int la=strlen(a),lb=strlen(b);
int j=0;
for(int i=la-1;i>=0;i--)
{
c[++j]=a[i]-'0';//c[1]~c[la];
}
j=0;
for(int i=lb-1;i>=0;i--)
{
d[++j]=b[i]-'0';
}
for(int i=1;i<=la;i++)
{
for(int j=1;j<=lb;j++)
{
cj[i+j-1]+=c[i]*d[j];
}
}
for(int i=1;i<=la+lb-1;i++)
{
cj[i+1]+=cj[i]/10;
cj[i]=cj[i]%10;
}
int l;
for(int i=la+lb;i>=1;i--)
{
if(cj[i]!=0)
{
l=i;
break;
}
}
for(int i=l;i>=1;i--)
{
ans[len++]=cj[i]+'0';
y[len-1]=ans[len-1];
}
}
void add(char sa[],char sb[])
{
memset(sum,0,sizeof(sum));
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int len=0,lmax,r=0,la,lb;
//让a,b 低位对齐;
la=strlen(sa),lb=strlen(sb);
for(int i=la-1;i>=0;i--)
a[la-1-i]=sa[i]-'0';//48;
for(int i=lb-1;i>=0;i--)
b[lb-1-i]=sb[i]-'0';//48;
//数学运算,逐位相加,考虑进位;
lmax=max(la,lb)+1,r=0;//r:进位;
for(int i=0;i<=lmax;i++)
{
c[i]=(a[i]+b[i]+r)%10;//个位写上去;
r=(a[i]+b[i]+r)/10;//十位作为进位;
}
//输出;
while(c[lmax]==0)//把高位的0去掉;
lmax--;
while(lmax>=0)
sum[len++]=c[lmax]+'0',
p[len-1]=sum[len-1],
lmax--;
}
int jian(char sa[],char sb[])
{
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
int la,lb,v,r=0,cha=0;
la=strlen(sa),lb=strlen(sb);
if(la!=lb&&la<lb)
return -1;
if(la==lb&&sa<sb)
return -1;
for(int i=la-1;i>=0;i--)
a[la-i]=sa[i]-'0';
for(int i=lb-1;i>=0;i--)
b[lb-i]=sb[i]-'0';
for(int i=1;i<=la;i++)
{
v=a[i]-b[i]-r;
if(v<0)
c[i]=v+10,
r=1;
else
c[i]=v,
r=0;
}
for(int i=la;i>=1;i--)
if(c[i])
{
la=i;
break;
}
for(int i=la;i>=1;i--)
cha=cha*10+c[i];
return cha;
// for(int i=la;i>=1;i--) cout<<c[i];
}
int S(char x[])
{
int len=strlen(x),sx=0;
for(int i=0;i<len;i++)
sx+=x[i]-'0';
return sx;
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
read(t);
while(t--)
{
memset(y,0,sizeof(y));
memset(p,0,sizeof(p));
cin>>s;
if(s==0) continue;
if(s[0]=='0')
{
cout<<0;
continue;
}
mul(s,"9");
int len=strlen(y);
for(int i=0;i<len;i++)
p[i]=y[i];
for(int k=1;k<=10;k++)
{
if(p[strlen(p)-1]=='0')
{
break;
}
add(p,"1");
}
while(jian(p,y)!=-1)
{
int ss=S(p);
if(ss==jian(p,y))
{
int len=strlen(p);
for(int i=0;i<len-1;i++)
cout<<p[i];
cout<<endl;
break;
}
len=strlen(p);
if(jian(p,y)>9*len)
{
cout<<-1<<endl;
break;
}
add(p,"10");
}
}
}