bluecode-数字魔法的加一操作

61 阅读2分钟

问题描述

数字魔法师小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;
}