素数,指的是大于1的整数中,只能被1和这个数本身整除的数
注意:1不是素数
一.判断一个数是不是素数
方法一:一般方法
假设这个数是n,我们就拿这个数和从2到n-1的每个数去和这个数做取余操作,如果有一个数可以使得余数为0,则这个数不是素数,反之则这个数为素数。
//判断一个数是不是素数
#include <stdio.h>
int main()
{
int a;
printf("请输入一个数:\n");
scanf("%d", &a);
int t=1;
for (int i = 2; i < a; i++)
{
if (a % i == 0)
{
t = 0;
break;
}
}
if (t == 0)
{
printf("%d 不是素数!\n", a);
}
else
{
printf("%d是素数!\n", a);
}
return 0;
}
方法二: 不超过本身的1/2
每个数的因数中,其中一个不会超过本身的1/2;
比如:因为1*12=12 2*6=12 3*4=12 所以12的因数有1和12,2和6,3和4,每组因数中都有一个不会超过12这个数的1/2;
这样我们就可以对方法一优化一下
#include <stdio.h>
int main()
{
int a;
printf("请输入一个数:\n");
scanf("%d", &a);
int t=1;
for (int i = 2; i < a/2; i++)
{
if (a % i == 0)
{
t = 0;
break;
}
}
if (t == 0)
{
printf("%d 不是素数!\n", a);
}
else
{
printf("%d是素数!\n", a);
}
return 0;
}
方法三:不超过本身的开方
每个数的因数中,其中一个不会超过本身的开方;
比如:因为1*16=16 2*8=16 4*4=16 所以16的因数有1和16,2和8,4和4,每组因数中都有一个不会超过16这个数的开方;
这样我们就可以对方法二优化一下
#include <stdio.h>
#include <math.h>
int main()
{
int a;
printf("请输入一个数:\n");
scanf("%d", &a);
int t = 1;
for (int i = 2; i <= sqrt(a); i++) //sqrt()是开方的意思,这个函数在math.h文件里
{
if (a % i == 0)
{
t = 0;
break;
}
}
if (t == 0)
{
printf("%d 不是素数!\n", a);
}
else
{
printf("%d是素数!\n", a);
}
return 0;
}
二.给定整数m和n区间内素数的个数并对它们求和.
方法一:一般方法
// 本题要求统计给定整数M和N区间内素数的个数并对它们求和.
//1不是素数,单独考虑1
#include <stdio.h>
int main()
{
int m, n, flag = 0, sum = 0, t = 0;
printf("请输入M和N的值(1<=m<=n<=500):\n");
scanf("%d%d", &m, &n);
for (int i = m; i <= n; i++)
{
if(i==1)
i = 2;
for (int j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 1;//不是素数,flag=1
break;
}
}
if (flag == 0) //flag==o,是素数的情况
{
t++;
sum += i;
// printf("%d为素数\n", i);//这句话可以用来输出素数
}
else //flag==0,不是素数的情况
flag = 0;
}
printf("%d与%d之间有%d个素数\n", m, n, t);
printf("它们的和为%d\n", sum);
}
三.输出n以内的素数
方法一:一般方法
在判断一个数是不是素数的基础上加一个循环
#include <stdio.h>
#include <math.h>
int main()
{
int number, isPrime = 1, x;
printf("请输入一个数:\n");
scanf("%d", &number);
printf("%d里的素数有:", number);
for (int y = 1; y <= number; y++)
{
for (int i = 2; i < sqrt(y); i++) // 判断y是不是素数//如果y不是素数,则isPrime = 0;
{
if (y % i == 0)
{
isPrime = 0;
break;
}
}
if (isPrime != 0)
{
printf("%d ", y);
}
else
{
isPrime = 1;
}
}
return 0;
}
方法二:倍数
1.令x为2
2.将2x、3x、4x直至ax (ax< n)的数标记为非素数
3.令x为下一个没有被标记为非素数的数,重复2
4.直到所有的数都已经尝试完毕
//将n以内所有的数的isPrime值为1(真)——数组
//将所有的2(3,4...)的倍数的数的isPrime值为0(假)——循环
//输出剩下isPrime值为1(真)的数——循环
#include <stdio.h>
int main()
{
int i;
int x;
int maxNumber;
printf("请输入一个数:\n");
scanf("%d", &maxNumber);
int isPrime[maxNumber+1];
for (i = 1; i < maxNumber+1; i++)
{
isPrime[i] = 1; // 让所有的isPrime[i]值为1,即先将所有数标记为素数
}
for (x = 2; x < maxNumber; x++) // 让x从2开始,往后,x为下一个标记为素数的数,(因为for循环只有一个if语句,x如果是标记为非素数(isPrime[x]=0)的数,那么x无法进入if,那便继续x++,直到x为下一个没有标记为非素数的数即可进去if)
{
if (isPrime[x]) // isPrime为真(即为1)的话进入if
{
for (i = 2; i * x < maxNumber+1; i++) // i*x为 2(3,4...)倍的x
{
isPrime[i * x] = 0; // 令x的2(3,4...)倍数的数isPrime值为0
}
}
}
for (i = 2; i <= maxNumber; i++)
{
if (isPrime[i]) // isPrime为真(即为1)的话进入if
{
printf("%d ", i);
}
}
printf("\n");
return 0;
}