⭐【暴力素数】PAT A1152 Google Recruitment

题目描述

在这里插入图片描述

知识点

素数

实现

码前思考

  1. 这道题就是遍历,然后判断是否是素数。但是这道题,我有两个测试点一直没过,因为我把判断素数的函数写错了,而且还是我之前一直未发现的错误!:
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. 这道题为我敲响了警钟,不注意细节的后果。。。卡了1个小时。。。

二刷代码

我发现我二刷没有第一次写那么细心了:

  1. 我没有考虑负数的情况了(虽然也能过题。。。),也没有判断k>l的情况😔;
  2. 我在素数判断里面,直接是if(n==1)正确的写法应该是if(n<=1),否则遇到0的时候就会出错!!!(素数的判断是基于正整数的)
  3. 在遍历判断时,没有使用sqrt(),而是直接暴力。。。这是我粗心的表现了!
  4. 此外注意第一次错的那种情况,不用+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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值