杭电 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);
        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("
");
        for(i = n-1; i >= 0; i--)
        {
            printf("%c",x[i]);
        }
        printf("
");
    }

    return 0;
}


原文地址:https://www.cnblogs.com/javawebsoa/p/3215061.html