题目大意:给出一个数判断它是不是素数, 本题中1和2不是素数
简单题
code:
#include <stdio.h>
#include <math.h>
int is[16002];
int is_prime(int x)
{
int i = 0, j =(int)sqrt(x);
for(i = 2; i<=j; i++)
if(x%i == 0)
return 0;
return 1;
}
int main()
{
int i = 0, n = 0, count = 0;
for(i = 3; i<=16000; i++)
is[i] = is_prime(i);
while(scanf("%d", &n), n>0)
{
printf("%d: ", ++count);
if(is[n])
printf("yes\n");
else
printf("no\n");
}
return 0;
}
筛选法
code:
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
int i = 0, j = 0, n =0, count = 0, prime[16002];
for(i = 2; i<=16002; i++)
if(i%2) prime[i] = 1;
else prime[i] = 0;
prime[1] = prime[2] = 0;
for(i = 3; i<=sqrt(16002); i++)
{
if(prime[i] == 1)
{
for(j = i*i; j<=16002; j += i)
prime[j] = 0;
}
}
while(scanf("%d", &n) , n>0)
{
printf("%d: ", ++count);
if(prime[n] == 1)
printf("yes\n");
else
printf("no\n");
}
return 0;
}
只存储奇数的筛选法 prime[0]判断的是3是否是素数, 依次类推每个i对应的为i*2+3
code:
#include <stdio.h>
#include <math.h>
#define max 16002/2
int main()
{
int i = 0, j = 0, n = 0, count = 0, prime[max];
for(i = 0; i<max; i++)
prime[i] = 1;
for(i = 0; i<=(sqrt(2*max+3)-3)/2+1; i++)
{
if(prime[i] == 1)
for(j = (i*2+3)*(i*2+3); j<=2*max+3; j += i*2+3)
if(j %2 == 0)
continue;
else
prime[(j-3)/2] = 0;
}
while(scanf("%d", &n), n>0)
{
printf("%d: ", ++count);
if(n%2 == 0)
printf("no\n");
else
{
if(prime[(n-3)/2] == 1)
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}