1094 谷歌的招聘 (20 point(s)) (测试点一、二、四、五)
-
最开始的时候不记得截断字符串的参数是怎么传递的,所以用了手动拼接的方式来截断。
for(int j = 0; j < K; j++) tmp += str[i+j];写完后看了下,原来 substr() 有两个参数,第一个参数是 pos 起始位置,第二个参数 len 是长度。所以可以写成。
tmp = str.substr(i, K); -
测试点一。
0 和 1 可能当成数字判断是否是素数,但是之前不记得判读素数会包括 2 之前的数了,或者说只记得要从 2 开始,而忽略 0 1 的判断。
实际上,算法笔记里面的判断素数函数也对 2 之前特殊判断,这算之前思路上的的漏洞。
![image]()
-
测试点二、五。
理解下为什么要把 < 改成 <= 。因为实际元素个数与下标差值为 1 。比如我们有 3 个元素,最后一个元素的下标是 2 。
我们现在遍历连续数字,假设最低位数 K 是 1 ,当我们遍历可以发现,如果还是 < 没有等号,最后下标会遍历到 3 - 1 = 2 加上 < 实际下标是 1 < 2 。这会遗漏最后一个元素。
-
测试点四。
改正上面的 <= 后还差最后一个测试点,而这个测试点将 size() 换成 L 可以解决。
造成这个问题的原因是, size() 的返回值是 unsigned int 。如果 K > size(), size() - K 运算后仍然会是正值而继续循环,但我们知道这时候连续数字位不足,应该退出循环了。
所以换成 L - K 才能保证结果为负值正常退出。
// 25 points
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int p){
if(p <= 1) return false;
for(int i = 2; i <= sqrt(p); i++)
if(p % i == 0)
return false;
return true;
}
int main() {
string str;
int L, K;
cin >> L >> K >> str;
for(int i = 0; i <= L - K; i++){
string tmp = "";
tmp = str.substr(i, K);
if(isPrime(stoi(tmp))){
cout << tmp;
return 0;
}
}
cout << 404;
}
// 15 points
#include <bits/stdc++.h>
using namespace std;
bool isPrime(int p){
for(int i = 2; i <= sqrt(p); i++)
if(p % i == 0)
return false;
return true;
}
int main() {
string str;
int L, K;
cin >> L >> K >> str;
for(int i = 0; i < L - K; i++){
string tmp = "";
for(int j = 0; j < K; j++) tmp += str[i+j];
if(isPrime(stoi(tmp))){
cout << tmp;
return 0;
}
}
cout << 404;
}

浙公网安备 33010602011771号