题目来源:https://leetcode.cn/problems/minimum-addition-to-make-integer-beautiful/
C++题解: 本题难度为中等。题解:找到满足n+x为美丽整数的最小非负整数x关键为找到new=n+x。进位可以使总数字和+1,再减去低位的数值。所以我们可以计算从高位往低位各个数字的和,即467分别为0,4,10,17,进位之后和变为1,5,11,18,所以如果target是6的话,最小new就是500,如果target是4的话,则需再进一位,变成1000。为找到最小new,需从低位数字和开始判断(即18,11,5,1)。
注意n的长度范围和n的最低位sum是否已经小于target。
第一步,将n按位分开并存放在nums中;第二步,计算每一位与其高位数字的和;第三步,从最低位开始往高位判断数字之和+1是否小于等于target(最低位数字之和判断时不用+1)。
class Solution {
public:
long long makeIntegerBeautiful(long long n, int target) {
long long x=0,ten=0,ten_=0;
long long nums[13];//存放n的每个位置上的数值
int ind, sum = 0;
bool flg = true;
int sums[13];//存放n的每个位置上的数值与高位数值的和
//将n按位拆分开
for (int ii=0; ii<13; ii++){
ten = pow(10,ii+1);
ten_ = pow(10,ii);
if(ii==0) nums[ii] = n%ten;
else nums[ii] = (n%ten-n%ten_)/ten_;
}
//存放第jj位及其高位的和
for (int jj=12;jj>=0;jj--)
{
sum = sum+nums[jj];
sums[jj] = sum;
//flg用于判断n为几位数
if ((nums[jj]==0)&&flg) {ind = jj; flg = false;}
}
if(sum<=target) return x;
else
{
for(int kk=0; kk<ind+1; kk++){
//判断第kk位及其高位上的数值和是否+1就能小于target,则找到目标最小数值
if (sums[kk]+1<=target){
ten = pow(10,kk+1);
ten_ = pow(10,kk);
x = (nums[kk]+1)*ten_-n%ten;
break;
}
//如果n的第kk位及其高位上的数值和+1都不能满足条件,目标最小数值为n的高一个数量级
if(kk == ind) x = pow(10,ind)-n;
}
}
return x;
}
};
2022/10/30日周赛遇到的题目,本地题解pow(10,n)出现点问题,目前没有发现问题在哪。因此不提供本地题解。