题目描述
知识点
素数
实现
码前思考
- 这道题就是遍历,然后判断是否是素数。但是这道题,我有两个测试点一直没过,因为我把判断素数的函数写错了,而且还是我之前一直未发现的错误!:
bool check(ll cur){
if(cur <= 1){
return false;
}else{
//注意了!
ll sqr = (ll)sqrt(1.0*cur)+1;
for(ll i=2;i<=sqr;i++){
if(cur % i == 0){
return false;
}
}
}
return true;
}
注意:上面不需要ll sqr = (ll)sqrt(1.0*cur)+1;
是错误的,当cur=2
时就不对了!!!应该是ll sqr = (ll)sqrt(1.0*cur)
我之前一直都没有发现过。。。
代码实现
#include "bits/stdc++.h"
using namespace std;
//使用ll进行存储
typedef long long ll;
int k;
int l;
string number;
bool check(ll cur){
if(cur <= 1){
return false;
}else{
//注意了!
ll sqr = (ll)sqrt(1.0*cur);
for(ll i=2;i<=sqr;i++){
if(cur % i == 0){
return false;
}
}
}
return true;
}
int main(){
scanf("%d %d",&l,&k);
cin>>number;
int start=0;
if(number[0]=='-'){
start = 1;
}
int end=start+k-1;
int size = number.size();
if(end >= size){
printf("404");
return 0;
}else{
//说明可以运算,好像不能直接打印质数表!
while(end < size){
string tmp = number.substr(start,k);
ll cur = stoi(tmp);
//判断是否是质数
if(check(cur)){
cout<<tmp;
return 0;
}
start = start+1;
end = start+k-1;
}
}
printf("404");
return 0;
}
码后反思
- 这道题为我敲响了警钟,不注意细节的后果。。。卡了1个小时。。。
二刷代码
我发现我二刷没有第一次写那么细心了:
- 我没有考虑负数的情况了(虽然也能过题。。。),也没有判断k>l的情况😔;
- 我在素数判断里面,直接是
if(n==1)
,正确的写法应该是if(n<=1)
,否则遇到0
的时候就会出错!!!(素数的判断是基于正整数的) - 在遍历判断时,没有使用
sqrt()
,而是直接暴力。。。这是我粗心的表现了! - 此外注意第一次错的那种情况,不用+1,直接小于等于!
//不能直接使用素数表,所以得一个个判断,汗
#include <iostream>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll; //数字太大,使用ll
bool check(ll num){
if(num<=1){
return false;
}
//从2开始判断
ll sqr = (ll)sqrt(num*1.0);
for(ll i=2;i<=sqr;i++){
if(num % i == 0){
return false;
}
}
return true;
}
int main(){
int l,k;
scanf("%d %d",&l,&k);
string n;
cin>>n;
for(int i=0;i+k-1<n.size();i++){ //这个条件判断就很赞
ll curn = stoi(n.substr(i,k)); //妙
//进行判断
if(check(curn)){
cout<<n.substr(i,k);
return 0;
}
}
printf("404");
return 0;
}