PAT 1152 C++ 版

版权声明:如若转载,请联系作者。 https://blog.csdn.net/liu16659/article/details/86770683

PAT 1152 C++

1.题意

给出一串数字【其实是字符串】,让你找出其中连续的字符串是素数的串。

2.分析

  • 素数判断
  • 由字符串生成数字
  • 数字大小范围的界定

3.代码

#include<cstdio>
#include<cmath>
#include<iomanip>
#include<iostream>

#define maxn 1005
using namespace std;

bool isPrime(long long num){
	if(num == 0) return false;
	if(num == 1) return false; 
	int i;
	for(i = 2;i<= sqrt(num);i++){
		if(num%i == 0) return false;
	}
	if(i > sqrt(num)) return true;
}

int main(){
	int L,M;
	char str[maxn];
	cin >>L >> M;
	int i;
	cin >> str;
	
	long long num = 0;//待判断的数 
	int count;
	for(i = 0; i <= L- M ;i++){
		count = 0;//reset to 0 
		num = 0;
		while(count < M){
			num = num*10 + str[i+count]-'0';
			count++;
		}
		//cout <<"num = "<<num<<"\n";			
		if( isPrime(num) ){			
			cout << setfill('0')<<setw(M)<<num<<"\n";
			break;
		}
	}
	if(i > L- M ){
		cout <<"404"<<"\n";
	}	
}

4.测试用例

20 5
23654987725541023819

20 5
23600007725541023819

20 6
23654987725541023819

20 7
23654987725541023819


18 9
516642742746639193

10 9
1100000007

6 4
211236

5 2
10234

5.注意

  • 刷题的时候,如果感觉代码是对的,但是提交又有成片的问题,这个时候就需要看看关键代码是否存在漏洞了。因为只有关键代码出问题的时候,才会导致这个问题的出现。如下图所示:
    在这里插入图片描述
    这题很简单,但是我只过了两个测试用例,连第一个测试用例都没有通过。说明基础代码是有问题的。于是我检查代码,发现在素数判断的代码我写成了如下的样子:
bool isPrime(long long num){
	if(num == 0) return false;
	if(num == 1) return false; 
	int i;
	for(i = 2;i<= sqrt(num);i++){
		if(num%i == 0) break;
	}
	if(i > sqrt(num)) return true;
}

很显然,这里是错误的,我虽然break了,但是没有返回false。导致还是会返回真。修改如下即可。

bool isPrime(long long num){
	if(num == 0) return false;
	if(num == 1) return false; 
	int i;
	for(i = 2;i<= sqrt(num);i++){
		if(num%i == 0) return false;
	}
	if(i > sqrt(num)) return true;
}
  • 因为k<10。所以就要考虑到k =9的情况,为了保险起见使用long long类型比较合适。【其实int型足够。INT_MAX = 2147483647

猜你喜欢

转载自blog.csdn.net/liu16659/article/details/86770683
今日推荐