PAT Basic 1114. 全素日
1. 题目描述:
以上图片来自新浪微博,展示了一个非常酷的“全素日”: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;
}
}
标签:子串,输出,PAT,素日,int,素数,1114,Basic,Yes
From: https://www.cnblogs.com/tacticKing/p/17334419.html