题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=4608
解题思路
思路一:
与CodeForces - 1409D Decrease the Sum of Digits 有异曲同工之妙。
看当前数位之和与最小10倍数差多少,若此数加上这个差不发生最低位的进位,则直接修改最低位为原最低位+差即可;
若发生进位,那么我们就通过“大数加”,让进位加到次最低位,最低位先变成0,统计“大数加”完成后的数位和。再计算此时的数位和与最小10的倍数的差,将最低位修改为差即可。
代码部分可以不分情况,因为同一代码两者适用。
思路二:
若不发生进位,则直接修改最低位;
反之,从低位向高位找第一个小于9的数,让此位+1,之前遍历过的9全部修改为0,若最高位也为9,则最高位也置零,同时多开一位作为新最高位记成1。将最低位置为0,统计数位和,修改最低位。
代码
只有思路一的
#include<bits/stdc++.h> using namespace std; const int N = 1e5+10; int a[N], len, T, sum; char str[N]; int main() { cin>>T; while(T--){ sum = 0; scanf("%s", str); len = strlen(str); for(int i = 0;i < len;i ++) a[i] = str[len-i-1]-'0', sum+=a[i]; int d = 10-sum%10; int c = (d + a[0]) / 10; for(int i = 1;i < len;i ++) { a[i] += c; c = a[i] / 10; a[i] %= 10; } if(c) a[len++] = 1; a[0] = 0; sum = 0; for(int i = 0;i < len;i ++) sum += a[i]; a[0] = sum%10?10-sum%10:0; for(int i = len-1;i >= 0;i --) printf("%d", a[i]), a[i] = 0; printf("\n"); } return 0; }