杭电 HDU 4608 I-number

http://acm.hdu.edu.cn/showproblem.php?pid=4608


听说这个题是比赛的签到题。。。。。。无语。。。。。

问题:给你一个数x,求比它大的数y。
y的要求:
1、y>x
2、y的每一位数相加的和为10的倍数
3、求最小的y

直接模拟,个位数加一然后求各位数总和是否为10的倍数。。。

有的人还考虑了前导零和后导零导致错误。这个题不用考虑那么多。。。坑。。。。

这个题一开始做的好郁闷,没有考虑到 最高位进位,导致我提交全是WA,所以我用的数组存数据,而且是倒着存,即个位在x[0]处,这样存有个好处就是进位时不需要对整个数组
进行移动来给新的最高位空出位置(PS,其实好像也可以用习惯的存储,只要用a[0]来预存一个最高位进位,反正最多只会进位一次。。)

AC代码:
#include<iostream>

#include<cstdio>

#include<cstring>



using namespace std;



char x[100010],b[100010];



int main()

{

    int t,d,i,n,p;

    scanf("%d",&t);

    while(t--)

    {

        memset(x,0,sizeof(x));

        scanf("%s",&b);

        n = strlen(b);

        for(i = 0; i < n; i++)

        {

            x[n-1-i] = b[i];

        }

        n = strlen(x);

//        printf("n:%d\n",n);

        p = 1;

        while(p%10!=0)

        {

            p=d=0;

            x[0] += 1;

   //         printf("%c ",x[n-1]);

            while(x[0+d] > '9')   //处理进位

            {

                x[0+d] = '0';

                d++;

                if(d==n)  //如果最高位再进位后更新长度并使新的最高位数为1

                {

                    x[0+d] = '1';

                    n++;

                }

                else

                {

                    x[0+d] += 1;

                }

  //              printf("d:%d n:%d",d,n);

            }

            for(i = 0; i < n; i++)

            {

                p += (int)(x[i]-'0');

            }

        }

 //       printf("\n");

        for(i = n-1; i >= 0; i--)

        {

            printf("%c",x[i]);

        }

        printf("\n");

    }



    return 0;

}



 

你可能感兴趣的:(number)