问题 U: 20级期末机试2-素数串(10分)
#include<stdio.h>
#include<math.h>
#include<string.h>
int isprime(int n)
{
if(n<2)
return 0;
for(int i=2;i*i<=n;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int main()
{
char ch[1001]={0};
while(scanf("%s",ch)!=EOF)//数组名就是头地址,不用再取地址
{
int len=strlen(ch);
int notflag=0;
for(int i=0;i<len/3;i++)
{
int num=(ch[3*i]-'0')*100+(ch[3*i+1]-'0')*10+(ch[3*i+2]-'0');
if(isprime(num)==0)
{
printf("NO\n");
notflag=1;
break;
}
}
if(notflag==0)
{
if(len%3==2)
{
int num1=(ch[len-1]-'0')+(ch[len-2]-'0')*10;
if(isprime(num1)==0)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
else if(len%3==1)
{
int num2=ch[len-1]-'0';
if(isprime(num2)==0)
{
printf("NO\n");
}
else
{
printf("YES\n");
}
}
else if(len%3==0)
{
printf("YES\n");
}
}
}
return 0;
}
题目描述
中南CC君最近迷上了素数,素数是指除了1和本身外不能被其他数整除的正整数,2是最小的素数。他发现有一种叫素数串的整数很有意思。它要求从该整数左边开始,每取3位数字构成的整数是素数,剩余的不够3位的整数也是素数。如23311317就是素数串,因为233,113,17都是素数,但是233111就不是,因为111不是素数。给你一个n(1≤n≤101000),你能帮CC君判断一下是素数串整数吗?
输入
多组样例。每行一个样例包含一个整数n。
输出
对于每一个输入的n,输出一个结果,如果是素数串整数,输出"YES",否则输出"NO"。每个输出占一行。
样例输入 Copy
2 3892 100733
样例输出 Copy
YES YES NO
#include<stdio.h>
#include<string.h>
// hecker:233002 YES
// 2330 NO
int b[1005]={0};
int len;
char str[1005];
void Eratosthenes(){
b[0]=b[1]=1;
for(int i=2;i*i<=1000;i++)
if(b[i]==0)
for(int j=i*2;j<=1000;j+=i)
b[j]=1;
}
int check(){
int i=0;
while(i+3<len){
int n=0;
for(int j=i;j<i+3;j++)
n=n*10+str[j]-'0';
if(b[n]==1)
return 0;
i+=3;
}
int n=0;
for(int j=i;j<len;j++)
n=n*10+str[j]-'0';
if(b[n]==1) return 0;
return 1;
}
int main(){
Eratosthenes();
while(scanf("%s",str)!=EOF){
len=strlen(str);
if(check()==1)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
1、“ 字符 ” 数组的输入,数组名就是头地址,不用再取地址。
2、i*i<n i*i<=n 区别很大,3个小时的教训,凋谢,要吐了。
3、打表法判断素数 c语言,素数打表(4种方法)_Matt小特的博客-CSDN博客
4、i*i<=n的注意事项——刷题经验_Echo_ac的博客-CSDN博客