1152 Google Recruitment 20

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

这题已经拿到了满分。

回头来看,这题几个别扭的地方:

  1. 输入L位长度的数字,我用的是scanf("%s",str);来接收字符串。
  2. 在判断素数的时候,我用的是i*i<=n来判断,没有用开方之类的。
  3. 在处理前导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;
}

值得学习的地方有:

  1. 直接用cin把int和string都输入了,我由于一直害怕cin超时,所以习惯了用scanf
  2. 他截取k个数字用的是string.substr(pos,len);并且用stoi(t)直接获得了int
  3. 由于他截取了字符串t,所以可以直接用cout输出,不用像我一样用单个字符
  4. 输出以后他没用break,而是直接return 0;而我用了flag判断跳出循环怎么处理
  5. 在判断素数时我不够严谨,虽然没有出错,但还是应该考虑n为0或1的情况。

猜你喜欢

转载自blog.csdn.net/supertian007/article/details/87882947