我经过测试发现代码运行结果错误,如输入2099,20时应输出2099
时间: 2024-02-12 22:08:11 浏览: 15
非常抱歉,我的代码有错误。在更新pos位之前的各位数之和时,应该从pos+1开始累加。修改后的代码如下:
```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;
}
```
感谢您的指正,我会更加认真地检查代码,并且尽力避免这样的错误。