PAT Basic 1094. 谷歌的招聘

发布时间 2023-04-13 19:19:00作者: 十豆加日月

PAT Basic 1094. 谷歌的招聘

1. 题目描述:

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

prime.jpg

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

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

2. 输入格式:

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

3. 输出格式:

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

4. 输入样例:

20 5
23654987725541023819
10 3
2468001680

5. 输出样例:

49877
404

6. 性能要求:

Code Size Limit
16 KB
Time Limit
200 ms
Memory Limit
64 MB

思路:

编写子函数isPrime()进行素数判断,从头开始遍历字符串将给定长度的子串转换为数字后进行判断和输出,这里K最大为9,所以相应子串对应的数值小于\(10^9\),不用担心int类型存不下。第一次提交时testpoint1,2报wrong answer,主要涉及两个点:

  • 素数判断时不要忘记对0和1进行判断,两个都不是素数,加上0的判断后过了testpoint1。
  • 结果输出时要输出原始子串,这里我一开始输出的是转换后的整数类型,修改为输出字符串后过了testpoint2。

My Code:

#include <stdio.h>
#include <string.h> // strncpy header

#define MAX_LEN (1000+1) // MAX_LEN + '\0'

int isPrime(int num);

// first submit testpoint1, 2 wrong answer
int main(void)
{
    int l=0, k=0;
    char num[MAX_LEN] = "";
    int i=0, j=0; // iterator
    int tempNum=0;
    char output[MAX_LEN] = "";
    
    scanf("%d%d", &l, &k);
    scanf("%s", num);
    //printf("%s\n", num);
    
    for(i=0; i+k-1< l; ++i)
    {
        tempNum=0;
        for(j=0; j<k; ++j)
        {
            tempNum *= 10; // make a carry
            tempNum += (num[i+j] - '0');
        }
        if(isPrime(tempNum))
        {
            //char *strncpy(char *dest, const char *src, size_t n)
            strncpy(output, num+i, k);
            printf("%s", output); // this fixed testpoint2
            
            //printf("i: %d\n", i);
            //printf("%d", tempNum);
            return 0;
        }
    }
    printf("404");
    
    return 0;
}

int isPrime(int num)
{
    int i=0; // iterator
    
    // the judge of num==0 fixed testpoint1.
    if(num==1 || num==0) return 0; // 1 is not a prime, 0 is not a prime
    
    for(i=2; i*i<=num; ++i)
    {
        if(num % i == 0)
        {
            return 0;
        }
    }
    
    return 1;
}