hdu4608 - I-number(水题)

多校联赛第一场1009

有点大数的意思。。。

从给定的X往上加就行了。。。

对于n位的数字来说,

 假如不需要增加长度就可以找到Y的话,那么Y < X + 20

        证明:假如前n-2位的数字之和为CC,  则CC%10肯定是位于【0...9】之中的,所以后两位只需对应凑出【10....1】即可。

       其中为了凑出10需要用两位形成【19,28,37,,,91】中的数,所以我们最多只需要动用两位。

       给出这样的例子:如992000--->992019

假如需要增加长度的话,如9999这样的数,

        那么后面第一个Y值肯定是100009这样的数,这样的数也满足式Y<X+20,所以既可以特判,也可以按照上面那种情况暴力。

代码如下:

#include <cstdio>
#include <cstring>
#define M 100005
char str[M];
int num[M], sum[M];
int main ()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",str);
        int len = strlen(str);
        for(int i = 0; i < len; i++)
        {
            num[i] = str[i]-'0';
            sum[i] = i==0?num[i]:sum[i-1]+num[i];
        }
        if(sum[len-1]==0) { printf("10\n"); continue; }
        num[len] = 0;
        while(1)
        {
            num[len-1]++;
            sum[len-1]++;
            if(num[len-1]==10)
            {
                for(int i = len-1; i >= 0; i--)
                {
                    num[i] += num[i+1]/10;
                    num[i+1]%=10;
                }
                if(num[0]==10) break;
                for(int i = 0; i < len; i++)
                    sum[i] = i==0?num[i]:sum[i-1]+num[i];
            }
            if(sum[len-1]%10==0) break;
        }
        if(sum[len-1]%10==0&&num[0]!=10)
            for(int i = 0; i < len; i++)
                printf("%d",num[i]);
        else
        {
            printf("1");
            for(int i = 0; i < len-1; i++) printf("0");
            printf("9");
        }
        printf("\n");
    }
    return 0;
}


 

你可能感兴趣的:(hdu4608 - I-number(水题))