问题描述
小 W 拥有一项魔法,可以对任意数字字符串进行加一的操作,比如当他拿到 “798” 这样的数字字符串,每一次操作,他会将其中每一个字符进行加一,比如经过一次操作后得到了 “8109”。他想知道操作 `k` 次后,这个数字将会变成多少,由于答案可能很大,最终结果需要对 1000000007 取模。
标准输入:
第一行输入 2 个整数 n(1 <= n <= 100000)和 k (0 <= k <= 100000),表示初始数字字符串长度和操作次数0。
第二行输入 1 个 n 位数字字符串 (1 <= s1 <= 9, 0 <= si <= 9, 1 < i <= n)。
标准输出:
一行答案,操作 k 次后的结果
样例输入:
3 1
798
样例输出:
8109
样例解释:
7->8 9->10 8->9,所以结果为 8109
问题分析:
首先,输入的是字符串,所以要先进行处理,将每一位存储在一个vector中,方便后续的加一操作。每次加一之后,会得到一个新的字符串,因此要重复进行上述操作。这里想到了使用while操作,循环k次后结束,每次都更新目前的字符串。最后,使用一个长整型接收字符串转换后的整数,进行取模操作后,再转回字符串即可。
完整代码实现:
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <stdlib.h>
#include <string>
#include <vector>
using namespace std;
std::string solution(int n, int k, std::string numStr) {
// Please write your code here
string newStr = numStr;
string tmp = newStr;
while (k > 0) {
vector<int> nums;
k--;
//每位存入数组
for (int i = 0; i < newStr.length(); i++) {
nums.push_back(newStr[i] - '0');
}
//每位加一
for (int i = 0; i < nums.size(); i++) {
nums[i]++;
}
//组合新字符串
tmp = "";
for (int i = 0; i < nums.size(); i++) {
tmp += to_string(nums[i]);
}
newStr = tmp;
}
long long num = stoll(newStr); //将字符串转换为长整数
num %= 1000000007;
newStr = to_string(num); //再转换回字符串
return newStr;
}
int main() {
// You can add more test cases here
std::cout << solution(3, 1, "798") << std::endl;
std::cout << solution(3, 3, "798") << std::endl;
return 0;
}
标签:加一,string,nums,int,C++,字符串,include,newStr,刷题
From: https://blog.csdn.net/m0_52651829/article/details/142766640