题意:
给定一个数字编码N,大多数情况下可以找到一个数字编码M,其位数与编码N相等(编码可以从0开始),各位数字之和与编码N中各位数字之和相等,并且M是数值大于N的所有码中最小的一个,也可能要找的编码M不存在。 如给定编码N=134,则编码M=143;给定编码N=020,则编码M=101,形式化表述为f(N)=M,如果M不存在,则f(N)=-1。
思路:
从低位到高位,找到一个非0的x,向高位进1,并将x设置为0,个位设置为x-1;如果进位时碰到的是9,则将十位设置为x-1,个位设置为9。
代码:
int EqualEncodeNumber(int number)
{
int factor = 10;
while ((number % factor) == 0)
{
factor = factor * 10;
}
factor /= 10; // 数量级
int last1 = (number / factor) % 10; // 倒数第一位
int last2 = (number / factor / 10) % 10; // 倒数第二位
int ret = number;
ret = ret - last1 * factor; // 将最后不为0的那一位置为0
ret = ret + 10 * factor; // 向高位进一
ret = ret - (ret % 10) + last1 - 1; // 设置个位为last1 - 1;
if (9 == last2)
{
last1 = ret % 10; // 个位
ret = ret - (ret % 100);
ret = ret + last1 * 10 + 9;
}
return ret;
}
程序中出现的问题:
(1)没有考虑连续的9的情况,如1239992。
解决思路:还是跟之前的思路一样先进位,如果进位时碰到的是9,则判断连续的9的个数m,则将倒数第m+1位设置为x-1,最后有m个9。