hdu4608 - I-number(水题)

来源:互联网 发布:止汗露的危害 知乎 编辑:程序博客网 时间:2024/05/29 12:26

多校联赛第一场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 100005char 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;}