一、
素数:除了1和它本身以外,不能被任何整数整除的数。例如 17就是素数,因为它不能被2~16的任一整数整除。因此判断一个整数m是否是素数,只需把m被2~m-1之间的每一个整数去除,如果都不能被整除,那么m就是一个素数
问:为什么 1 不是素数?
答:整数有一个性质,就是分解质因数的唯一性,即把一个大于1的整数分解质因数,他的形式是唯一的 比如12=2²*3 18=2*3²
而如果1是素数,则分解的形式就唯一的了,因为可以若干个1相乘。所以规定1不是素数
简化:m不必呗2~m-1之间的每一个整数去除,只需被2~√m之间的每一个整数去除就可以了。
#include <stdio.h>
#include <math.h>
int main(){
int m,i,k,flag;
printf("set m:");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;i++){
if(m%i==0){
flag = 0;
break;
}else
flag = 1;
}
if(flag==0||m==1){
printf("no");
}else{
printf("yes");
}
return 0;
}
2、埃拉托色尼筛法
基本思路:给定候选内容,然后逐步用条件去判断某个候选者是否符合要求,将不符合的去掉,不断重复判断与删除的步骤,最后剩下的就是满足要求的内容。
判断素数:
- 先将1删除 (1 不是素数)
- 用2去除剩下的各个数,把能被2整除的数删除
- 用3去除剩下的各个数,把能被3整除的数删除
- ……
- 一直到比候选者小1 的数去除剩下的数,把能整除的删掉
- 剩下的全是素数
代码如下:
#include<stdio.h>
int main(){
int n;
printf("set n:");
scanf("%d",&n);
int i,j,d,nums[n],max; //d: divisor
// 将 1 ~ n 间的数作为候选
for(i=0;i<n;i++){
nums[i] = i + 1;
}
nums[0] = -1; //删去 1
//删除 2,3,4……的倍数
max = nums[n-1];
for(d=2;d<max;d++){
for(i=0;i<n;i++){
if(nums[i]>d){
if(nums[i]%d==0){
nums[i] = -1; //delete
}
}
}
}
//show
j = 0;
printf("Prime nums between 1 and n");
for(i=0;i<n;i++){
if(nums[i]>0){
if(j%10==0){
printf("\n");
}
printf("%5d",nums[i]);
j++;
}
}
return 0;
}
3、判断某一个数是否为素数
#include<stdio.h>
int main(){
int n,i,flag;
printf("set n:");
scanf("%d",&n);
if(n<=1){
printf("no");
}else{
for(i=2;i<n;i++){
if(n%i==0){
flag = 0;
break;
}else{
flag = 1;
}
}
if(flag==1){
printf("yes");
}else{
printf("no");
}
}
}