机试真题-暴力/大整数运算 XC 24.05.06.02
1. 题目描述
俊子哥拿到了一个正整数x,希望你能取出其中一段长度为k的数字(可以包含前导0),希望渠道的数尽可能最大,你能帮帮他吗?你只需要计算这个数模p的值
输入描述
第一行输入一个正整数x。
第二行输入两个正整数k,p,用空格隔开。
1<=x<=
1
0
1000
{10^{1000}}
101000
1<=p<=
1
0
9
10^9
109
1<=k<=
log
10
(
x
)
\log_{10}(x)
log10(x)
输出描述
一个整数代表最终得到的新数模p的值
示例 1
输入
123332
3 12
输出
8
2. 解题思路
直接暴力模拟即可,先求出最大的整数,再取模运算。比较的时候可以直接使用字符串string类型比较不用转换整数后比较(长度一致,对应位上字符大小与整数大小关系相同)。
#include <bits/stdc++.h>
using namespace std;
string mod(string str, int mod_num){
int result = 0;
int index = 0;
while(index < str.size() && str[index]==0) index++; //去除前导0字符
for(;index<str.size();index++){
result = (result* 10 + (str[index] - '0'))%mod_num;//对每一个进行取模运算
}
return to_string(result); //将最后结果转换成string
}
int main(){
string x;
cin>>x;
int k, p;
cin>>k>>p;
string ans(k, '0');
string tmp;
for(int i=0;i<=x.length() - k;i++){
tmp = x.substr(i, k);
if(tmp > ans){
ans = tmp;
}
}
string res = mod(ans, p);
cout<<res;
return 0;
}