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