1094 谷歌的招聘

自然常数 e 是一个著名的超越数,前面若干位写出来是这样的:e = 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921… 其中粗体标出的 10 位数就是答案。

本题要求你编程解决一个更通用的问题:从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数。

输入格式:
输入在第一行给出 2 个正整数,分别是 L(不超过 1000 的正整数,为数字长度)和 K(小于 10 的正整数)。接下来一行给出一个长度为 L 的正整数 N。

输出格式:
在一行中输出 N 中最早出现的 K 位连续数字所组成的素数。如果这样的素数不存在,则输出 404。注意,原始数字中的前导零也计算在位数之内。例如在 200236 中找 4 位素数,0023 算是解;但第一位 2 不能被当成 0002 输出,因为在原始数字中不存在这个 2 的前导零。

输入样例 1:
20 5
23654987725541023819
输出样例 1:
49877
输入样例 2:
10 3
2468024680
输出样例 2:
404
第一次16分,少了个判断范围,还是细节问题,素数判断就不用说了,找个模板记下来就行了,用不到素数表,素数筛。
这题也是 可以用stoi函数来转化字符串再进一步判断,也可以麻烦一点,我怕考试的机子的版本太低所以用的麻烦一点的。这题的关键就是范围的判断。
你从都到尾一个一个判断:
1.你可以 i+k-1<l 即i<l-k+1 我个人觉得这种好理解点
2.你可以i+k<=l 即i<=l-k

#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
bool is_prime(int n){
   if(n <2 || n>2 && n%2==0)  return false;
 for(int i=3;i*i<=n;i+=2)
    if(n%i==0){
        return false;
    }
    return true;
}
int main(){
   string s,bk;
   int l,k,flag=0;
   cin>>l>>k>>s;
   for(int i=0;i<l-k+1;i++){
     string t=s.substr(i,k);
     int d=0;
     for(int j=0;j<t.length();j++){
        d=d*10+t[j]-'0';
     }
     if(is_prime(d)){
         cout<<t;
         return 0;
     }
   }
   cout<<"404";
   return 0;
}

上一篇:MLIR与Code Generation


下一篇:Graph deep learning research工具包