PAT Basic 1114. 全素日

PAT Basic 1114. 全素日

1. 题目描述:

wbfg.JPG

以上图片来自新浪微博,展示了一个非常酷的“全素日”:2019年5月23日。即不仅20190523本身是个素数,它的任何以末尾数字3结尾的子串都是素数。

本题就请你写个程序判断一个给定日期是否是“全素日”。

2. 输入格式:

输入按照 yyyymmdd 的格式给出一个日期。题目保证日期在0001年1月1日到9999年12月31日之间。

3. 输出格式:

从原始日期开始,按照子串长度递减的顺序,每行首先输出一个子串和一个空格,然后输出 Yes,如果该子串对应的数字是一个素数,否则输出 No。如果这个日期是一个全素日,则在最后一行输出 All Prime!

4. 输入样例:

20190523
20191231

5. 输出样例:

20190523 Yes
0190523 Yes
190523 Yes
90523 Yes
0523 Yes
523 Yes
23 Yes
3 Yes
All Prime!
20191231 Yes
0191231 Yes
191231 Yes
91231 No
1231 Yes
231 No
31 Yes
1 No

6. 性能要求:

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

思路:

主要涉及素数判断和把字符串转为相应数字,这里利用字符数组的特性传递每个子串(每次传递字符指针date+i)。定义子函数judgeDate()进行每个子串的逻辑判断,若子串对应的数字为素数则返回1,在main()函数中维护变量primeCount记录素数的个数,若最后primeCount等于8则输出All Prime!

My Code:

#include <stdio.h>

int isPrime(int num);
int judgeDate(const char *substr);

int main(void)
{
    char date[9] = "";
    int i=0;
    int primeCount = 0;
    
    scanf("%s", date);
    for(i=0; i<8; ++i)
    {
        //printf("%s\n", date+i); // output substring
        primeCount += judgeDate(date+i);
    }
    
    if(primeCount == 8) printf("All Prime!\n");
    
    return 0;
}

int isPrime(int num)
{
    int i=0; // iterator
    
    if(num <= 1) return 0; // 0 and 1 is not a prime
    for(i=2; i*i<=num; ++i)
    {
        if(num % i == 0) return 0;
    }
    
    return 1;
}

int judgeDate(const char *substr)
{
    int num=0;
    int i=0; // iterator
    
    for(i=0; substr[i]; ++i) // convert substr to number
    {
        num *= 10;
        num += substr[i]-'0';
    }
    
    if(isPrime(num))
    {
        printf("%s Yes\n", substr);
        return 1;
    }
    else
    {
        printf("%s No\n", substr);
        return 0;
    }
}
posted @ 2023-04-19 19:40  十豆加日月  阅读(17)  评论(0编辑  收藏  举报