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;
}