题目链接

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