题目描述
数字魔法师小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
解题思路
问题理解
题目要求我们对一个数字字符串进行多次"进位"操作,每次操作都会对字符串中的每个数字进行加一操作,并且在遇到9时需要特殊处理。最终结果可能非常大,因此需要对结果进行取模操作。
数据结构选择
由于我们需要对字符串进行频繁的修改和插入操作,使用字符串作为主要数据结构是合适的。字符串的插入操作可以通过 std::string 的 insert 方法高效实现。
算法步骤
-
初始化:从输入的字符串开始。
-
模拟操作:对字符串进行
k次操作。每次操作包括:- 遍历字符串中的每个字符。
- 对每个字符进行加一操作。
- 如果字符是 '9',则将其变为 '0',并在前面插入 '1'。
-
处理大数:由于结果可能非常大,而模数是 1e9+7,因此处理的适合要开 long long 防溢出。
完整代码
string op(string s) {
string res;
for(int i = 0 ; i < s.size() ; i ++) {
if(s[i] == '9') res += "10";
else res += (s[i] + 1);
}
// cout << res << endl;
return res;
}
int solution(int n, int k, std::string s) {
for(int i = 0 ; i < k ; i ++) {
s = op(s);
}
int mod = 1000000007;
long long res = 0;
for(int i = 0 ; i < s.size() ; i ++) {
res = (res * 10 % mod + (s[i] - '0'));
}
// cout << res << endl;
return res;
}