版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/supertian007/article/details/87882947
题意:给出一个L(<=1000)位的数字,找出其中的可表示为素数的最左边的K(<10)个连续数字。如果找到,就输出这个数字,找不到就输出404。如果数字有前导0,也要输出。
思路:由于K<10,那么可以直接用int表示这个数字。这样最简单的做法就是K个数字为一段,从左向右检查。转为int检查是否为素数。
历程:先交了一份下面的代码,测试点2答案错误。
#include <cstdio>
using namespace std;
bool is_prime(int n){
for(int i=2;i*i<=n;i++){
if(n%i==0)return false;
}
return true;
}
void exec(){
int L,K;
scanf("%d%d",&L,&K);
char str[1010];
scanf("%s",str);
bool flag = true;
for(int i=0;i<=L-K;i++){
int temp=0;
for(int j=0;j<K;j++){
temp=temp*10+str[j+i]-'0';
}
if(is_prime(temp)){
printf("%d\n",temp);
flag=false;
break;
}
}
if(flag)
printf("404\n");
}
int main(){
// freopen("data.in","r",stdin);
exec();
return 0;
}
我懂了,是前导0没有处理,改成下面这样就行了。
#include <cstdio>
using namespace std;
bool is_prime(int n){
for(int i=2;i*i<=n;i++){
if(n%i==0)return false;
}
return true;
}
void exec(){
int L,K;
scanf("%d%d",&L,&K);
char str[1010];
scanf("%s",str);
bool flag = true;
for(int i=0;i<=L-K;i++){
int temp=0;
for(int j=0;j<K;j++){
temp=temp*10+str[j+i]-'0';
}
if(is_prime(temp)){//修改了下面4行
for(int j=0;j<K;j++){
printf("%c",str[i+j]);
}
printf("\n");
flag=false;
break;
}
}
if(flag)
printf("404\n");
}
int main(){
//freopen("data.in","r",stdin);
exec();
return 0;
}
这题已经拿到了满分。
回头来看,这题几个别扭的地方:
- 输入L位长度的数字,我用的是
scanf("%s",str);
来接收字符串。 - 在判断素数的时候,我用的是
i*i<=n
来判断,没有用开方之类的。 - 在处理前导0时,因为没办法写死
%05d
,所以只能用字符单个连续输出。
这题我写了38行,看了柳神只有24行。
他的代码如下:
#include <iostream>
#include <string>
using namespace std;
bool isPrime(int n) {
if (n == 0 || n == 1) return false;
for (int i = 2; i * i <= n; i++)
if (n % i == 0) return false;
return true;
}
int main() {
int l, k;
string s;
cin >> l >> k >> s;
for (int i = 0; i <= l - k; i++) {
string t = s.substr(i, k);
int num = stoi(t);
if (isPrime(num)) {
cout << t;
return 0;
}
}
cout << "404\n";
return 0;
}
值得学习的地方有:
- 直接用cin把int和string都输入了,我由于一直害怕cin超时,所以习惯了用scanf
- 他截取k个数字用的是
string.substr(pos,len);
并且用stoi(t)
直接获得了int - 由于他截取了字符串t,所以可以直接用cout输出,不用像我一样用单个字符
- 输出以后他没用break,而是直接
return 0;
而我用了flag判断跳出循环怎么处理 - 在判断素数时我不够严谨,虽然没有出错,但还是应该考虑n为0或1的情况。