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

题目来源

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

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

自然常数 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位连续数字组成的素数

  • 将K位连续数字用stoi()转换成整数,判断是否为素数

    • 是:输出,结束
    • 否:循环
  • 每次循环,下标向后移动一个单位,重复第一步

  • 如果下标 > L+K,说明没找到

    假定 L = 10, K = 5
    要在一个10位数里找到5位连续数字,组成素数
    那么循环的终止条件是什么?
    number:2 3 6 7 8 2 5 6 9 0
    index: 0 1 2 3 4 5 6 7 8 9
        i:           ↑
     当 i = 5,组成的5位数字是25690
     	i = L - K = 5
     	25690不是素数,i+1
     此时i = 6,不能在组成5位数字了,退出循环
     	循环终止条件:i > L - 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);
        }
    }
}
上一篇:使用docx4j实现docx转pdf(解决linux环境下中文乱码问题)


下一篇:python100天 -- 转义和‘end=‘‘‘