福尔认为,如果一个数x 中各位数之和为一个设定的值y ,则这个数是一个幸运数。福尔想知道的是,给定一个整数a ,不小于a 的最小幸运数是什么? 输入数据 输入数据有多组,每组为两个数串a,y(0≤a≤101000,0≤y≤105) ,分别为如上所述的两个整数。输出数据 对每组输入数据,请在单独的行中数串满足条件的最小的幸运数,若不存在则输出-1。请用c++语言编写此代码
时间: 2024-02-12 13:08:28 浏览: 65
以下是使用 C++ 编写的解法:
```cpp
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string a;
int y;
while (cin >> a >> y) {
int sum = 0;
for (char c : a) {
sum += c - '0';
}
if (sum >= y) {
cout << a << endl;
continue;
}
bool found = false;
for (int i = a.size() - 1; i >= 0; i--) {
sum += 9 - (a[i] - '0');
if (sum >= y) {
a[i] = a[i] + (sum - y);
for (int j = i + 1; j < a.size(); j++) {
a[j] = '0';
}
found = true;
break;
}
}
if (found) {
cout << a << endl;
} else {
cout << "-1" << endl;
}
}
return 0;
}
```
解题思路:
首先计算输入的数串 a 的各位数字之和 sum,如果 sum 大于等于 y,则 a 已经是一个幸运数,直接输出即可。
否则,从数串 a 的最后一位开始往前遍历,每次将当前位的数字变成 9,并将 sum 加上这个差值(即 9 - (a[i] - '0'))。如果此时 sum 大于等于 y,则将当前位的数字减去 sum 和 y 的差值,并将后面的所有位都变成 0。
如果遍历完整个数串 a 还没有找到一个幸运数,则输出 -1。
时间复杂度为 O(n),其中 n 是数串 a 的长度。
阅读全文