福尔认为,如果一个数x 中各位数之和为一个设定的值y ,则这个数是一个幸运数。福尔想知道的是,给定一个整数a ,不小于a 的最小幸运数是什么? 输入数据 输入数据有多组,每组为两个数串a,y(0≤a≤101000,0≤y≤105) ,分别为如上所述的两个整数。 输出数据 对每组输入数据,请在单独的行中数串满足条件的最小的幸运数,若不存在则输出-1。请用c++代码实现
时间: 2024-02-12 20:08:06 浏览: 65
幸运数问题C++源程序
以下是C++代码实现:
```cpp
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 100010;
int a[MAXN], b[MAXN], c[MAXN];
// a表示输入的数,b表示各位数之和,c表示累加和
int main() {
string s;
int y;
while (cin >> s >> y) {
// 初始化
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
int len = s.length();
for (int i = 0; i < len; i++) {
a[i+1] = s[i] - '0';
b[i+1] = b[i] + a[i+1];
}
int pos = len; // 从最高位开始往下找
while (pos > 0 && b[pos] >= y) { // 找到第一个符合条件的位置
pos--;
}
if (pos == 0) { // 所有位数之和都大于等于y,无解
cout << "-1" << endl;
continue;
}
int sum = 0;
for (int i = pos+1; i <= len; i++) { // 从pos+1位开始,把后面的数全变成0
sum += a[i];
a[i] = 0;
b[i] = b[i-1];
}
a[pos]++; // 把pos位加1
sum++;
b[pos] = b[pos-1] + 1;
for (int i = pos-1; i >= 1; i--) { // 把pos位之前的数全变成9,保证是最小的幸运数
if (sum + 9 >= y) {
a[i] = y - sum; // 这个位置的数要尽量小,所以取y-sum
sum = y;
break;
} else {
a[i] = 9;
sum += 9;
}
}
if (sum < y) { // 无解
cout << "-1" << endl;
continue;
}
for (int i = 1; i <= len; i++) {
cout << a[i];
}
cout << endl;
}
return 0;
}
```
思路解析:
首先,我们需要计算出输入的数的各位数之和,用数组b来表示。然后,我们从最高位开始往下找,找到第一个各位数之和小于y的位置,记作pos。
如果所有位数之和都大于等于y,那么无解,直接输出-1。
如果pos存在,我们需要把pos+1位到最低位的数全部变为0,然后把pos位加1,再把pos位之前的数全部变成9,这样才能保证是最小的幸运数。注意,加1之后pos位可能会进位,所以需要更新pos位之前的各位数之和。
如果pos不存在,说明所有位数之和都小于y,那么只需要在最高位加上y-b[1]即可,这样才能保证是最小的幸运数。如果最高位加上y-b[1]后大于等于10,那么无解。
时间复杂度为O(n),其中n为输入的数的位数。
阅读全文