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
】