题目链接
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;
}

京公网安备 11010502036488号