编程语言
首页 > 编程语言> > PAT 乙级 1094.谷歌的招聘 C++/Java

PAT 乙级 1094.谷歌的招聘 C++/Java

作者:互联网

题目来源

2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e 中最早出现的 10 位连续数字。能找出这个素数的人,就可以通过访问谷歌的这个网站进入招聘流程的下一步。

prime.jpg

自然常数 e 是一个著名的超越数,前面若干位写出来是这样的:e = 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921... 其中粗体标出的 10 位数就是答案。

本题要求你编程解决一个更通用的问题:从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数。

输入格式:

输入在第一行给出 2 个正整数,分别是 L(不超过 1000 的正整数,为数字长度)和 K(小于 10 的正整数)。接下来一行给出一个长度为 L 的正整数 N。

输出格式:

在一行中输出 N 中最早出现的 K 位连续数字所组成的素数。如果这样的素数不存在,则输出 404。注意,原始数字中的前导零也计算在位数之内。例如在 200236 中找 4 位素数,0023 算是解;但第一位 2 不能被当成 0002 输出,因为在原始数字中不存在这个 2 的前导零。

输入样例 1:

20 5
23654987725541023819

输出样例 1:

49877

输入样例 2:

10 3
2468024680

输出样例 2:

404

分析:

给出一个长度为L的数字N,在N中找到最早出现的K位连续数字组成的素数

C++实现:

#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <stack>
#include <cmath>
#include <map>

using namespace std;

// 从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数。

bool isPrime(int n) {
    if (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 N;
    cin >> L >> K >> N;
    int i;
    for (i = 0; i <= L - K; ++i) {
        int temp = stoi(N.substr(i, K));
        if (isPrime(temp)) {
            cout << N.substr(i, K);
            return 0;
        }
    }

    if (i > L - K) {
        cout << "404";
    }
    return 0;
}

Java实现:

import java.util.Scanner;

public class Main {
    public static boolean isPrime(int n) {
        if (n == 1) {
            return true;
        }
        for (int i = 2; i * i <= n; ++i) {
            if (n % i == 0) {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        int L, K;
        String N;
        Scanner sc = new Scanner(System.in);
        L = sc.nextInt();
        K = sc.nextInt();
        N = sc.next();
        int i;
        for (i = 0; i <= L - K; ++i) {
            String temp = N.substring(i, i + K);
            if (isPrime(Integer.parseInt(temp))) {
                System.out.println(temp);
                return;
            }
        }
        if (i > L - K) {
            System.out.println(404);
        }
    }
}

标签:1094,10,PAT,数字,输出,样例,C++,素数,include
来源: https://www.cnblogs.com/47Pineapple/p/12934456.html