测了好多数据都没问题,不知道为啥全WA
  • 板块P10253 说唱
  • 楼主Charlie_ljk
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/3/18 17:48
  • 上次更新2024/3/18 20:40:14
查看原帖
测了好多数据都没问题,不知道为啥全WA
1055198
Charlie_ljk楼主2024/3/18 17:48

求调!

#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");
        }
    }
}
2024/3/18 17:48
加载中...