问题描述
数字魔法师小U发现了一种特殊的数字变换魔法。这个魔法可以对一个数字字符串进行"进位"操作。每次操作规则如下:
- 对字符串中的每个数字进行加一操作
- 当某位数字为9时,加一后变成 0,并在前面补 1
例如:
- "798" 经过一次操作变成 "8109"(7→8, 9→0并向前增加一个1, 8→9)
- "999" 经过一次操作变成 "101010"
现在给定一个数字字符串 num_str(长度为n)和操作次数 k,请计算经过 k 次操作后得到的最终结果。由于结果可能非常大,请将答案对 1000000007 (10^9 + 7) 取模。
输入
- 第一行包含两个整数 n 和 k(1 ≤ n ≤ 50, 1 ≤ k ≤ 100)
- 第二行包含一个长度为n的数字字符串 num_str,仅由数字0-9组成
返回
- 返回一个整数,表示最终结果对 1000000007 取模后的值
测试样例
样例1:
输入:
n = 3 ,k = 1 ,num_str = "798"
返回:8109
解释:798 经过一次操作变成 8109
样例2:
输入:
n = 3 ,k = 3 ,num_str = "798"
返回:103221
- 第一次操作:798 → 8109
- 第二次操作:8109 → 92110
- 第三次操作:92110 → 103221
样例3:
输入:
n = 4 ,k = 3 ,num_str = "7989"
返回:10322132
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
const int MOD = 1000000007;
int solution(int n, int k, string num_str) {
while (k > 0) {
string next_num = "";
// 将字符串中的每一位数字加1
for (char c : num_str) {
int digit = c - '0'; // 将字符转换为整数
next_num += to_string(digit + 1); // 加1后转回字符串并拼接
}
num_str = next_num; // 更新 num_str
k--;
}
// 将结果字符串转换为整数并取模
long long result = 0;
for (char c : num_str) {
result = (result * 10 + (c - '0')) % MOD;
}
return result;
}
int main() {
// 测试用例
cout << (solution(3, 1, "798") == 8109) << endl; // 输出 8109
cout << (solution(3, 3, "798") == 103221) << endl; // 输出 103221
cout << (solution(4, 3, "7989") == 10322132) << endl; // 输出 10322132
return 0;
}