本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1646. 谷歌的招聘
原题传送:AcWing 1646. 谷歌的招聘
年 月,谷歌在硅谷的 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。
内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 位素数,这个素数是自然常数 中最早出现的 位连续数字。
能找出这个素数的人,就可以通过访问谷歌的这个网站进入招聘流程的下一步。
自然常数 是一个著名的超越数,前面若干位写出来是这样的: e=2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921…其中粗体标出的 位数就是答案。
本题要求你编程解决一个更通用的问题:从任一给定的长度为 的数字中,找出最早出现的 位连续数字所组成的素数。
输入格式
输入在第一行给出 个正整数,分别是 和 。
接下来一行给出一个长度为 的正整数 。
输出格式
在一行中输出 中最早出现的 位连续数字所组成的素数。
如果这样的素数不存在,则输出 。
注意,原始数字中的前导零也计算在位数之内。
例如在 中找 位素数, 算是解;但第一位 不能被当成 输出,因为在原始数字中不存在这个 的前导零。
数据范围
,
输入样例1:
20 5
23654987725541023819
输出样例1:
49877
输入样例2:
10 3
2468024680
输出样例2:
404
思路:
遍历枚举连续子串,找到第一个质数输出。
题解:
#include<bits/stdc++.h>
using namespace std;
bool prime(int n)
{
if(n <= 1)
return false;
for(int i = 2; i * i <= n; i++)
if(n % i == 0)
return false;
return true;
}
int l, k;
string s;
unordered_map<string, int> mp, st;
int main()
{
cin >> l >> k >> s;
for(int i = 0; i < l - k + 1; i++)
{
string str = s.substr(i, k);
int t = stoi(str);
if(prime(t))
{
cout << str << endl;
return 0;
}
}
cout << "404" << endl;
return 0;
}