这题我用的是C语言,如果用C++的话应该更快一点。
以上图片来自新浪微博,展示了一个非常酷的“全素日”:2019年5月23日。即不仅20190523
本身是个素数,它的任何以末尾数字3
结尾的子串都是素数。
本题就请你写个程序判断一个给定日期是否是“全素日”。
输入格式:
输入按照 yyyymmdd
的格式给出一个日期。题目保证日期在0001年1月1日到9999年12月31日之间。
输出格式:
从原始日期开始,按照子串长度递减的顺序,每行首先输出一个子串和一个空格,然后输出 Yes
,如果该子串对应的数字是一个素数,否则输出 No
。如果这个日期是一个全素日,则在最后一行输出 All Prime!
。
输入样例 1:
20190523
输出样例 1:
20190523 Yes
0190523 Yes
190523 Yes
90523 Yes
0523 Yes
523 Yes
23 Yes
3 Yes
All Prime!
输入样例 2:
20191231
输出样例 2:
20191231 Yes
0191231 Yes
191231 Yes
91231 No
1231 Yes
231 No
31 Yes
1 No
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdbool.h>
#define true 1
#define false 0
bool is_prime(int number){
//也可以改为int is_prime(int number),后面是return 1或return 0,不需要true/false。
if(number==1) return false;
else if(number==2) return true;
else{
for (int i=2; i<=sqrt(number); i++)
if(!(number%i)) return false;
return true;
}
}
int main(){
char date[9];
gets(date);
int i,j,k;
int count=0;//计数
char temp[9];
strcpy(temp,date);
//puts(temp);调试时检验用
int sum=0,len=strlen(temp);
for(i=0;i<8;i++){//先输出八行
sum=0;
if(i==0){//第一行
printf("%s",date);
for(j=0;j<8;j++){
sum=sum*10+date[j]-'0';//注意这里字符串转换为整数需要-'0'
}
if(is_prime(sum)){
printf(" Yes\n");
count++;
}else{
printf(" No\n");
}
}else{//第二行开始
for(j=0;j<len-1;j++){//每次将数左移一位
temp[j]=temp[j+1];
}
temp[j]='\0';//每次数左移之后将原末位值置空
printf("%s",temp);
len--;
sum=0;
for(k=0;k<len;k++){
sum=sum*10+temp[k]-'0';//注意这里字符串转换为整数需要-'0'
}
/printf(" %d",sum);调试时检验sum值是否正确用
if(is_prime(sum)){
printf(" Yes\n");
count++;
}else{
printf(" No\n");
}
}
}
if(count==8) printf("All Prime!\n");
return 0;
}
提交结果: