判断一个数是否为质数,可以通过以下步骤进行:
首先,需要明确什么是质数。质数是指只有1和它本身两个正因数,最小的质数是2,它也是唯一的偶数质数。
接下来,给出判断质数的具体步骤:检查数字是否小于2:如果数字小于2(即数字为0、1或负数),那么它一定不是质数。
检查数字是否可以被2整除:除了2以外,所有的偶数都不是质数。因此,如果数字大于2且是偶数,那么它就不是质数。
检查数字是否可以被其他数字整除:从3开始,到该数字的平方根(向下取整)为止,检查每一个奇数是否能整除该数字。如果找到任何一个能整除该数字的数,那么该数字就不是质数。
如果以上条件都不满足:那么该数字就是质数。
那么我们该如何用代码的形式来快速判断一个数是不是质数呢下面我们来写一些简单的代码
1.穷举法:
我们知道一个数除了能被自己和1整除外不能被其他数整除就是质数,那么我们可以写一个代码,让它依次除往下除,只要都不能整除就说明是质数。
下面是用vs2022写的一个代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a, b;
printf("请输入一个整数:");
scanf("%d", &a);
for (int i = 2; i < a; i++)
{
if (a % i == 0)
{
printf("%d不是质数\n", a);
break;
}
if (i == a - 1)
{
printf("%d是质数\n", a);
break;
}
}
return 0;
}
虽然这个代码可以用于判断一个数是不是质数,但是运算效率低,下面我们进行代码的优化:
2代码的优化(1)
我们知道,2是唯一一个偶质数,也就是说对于一个数来说,我们首先判断它是不是奇数,当他是奇数时,就一定不会被2的倍数整除,这样我们在后续的穷举过程中就不必一个一个除,可以跳过偶数,直接除奇数,这样的话,我们就将近减少了一半的计算量。下面我们写一个代码来实现这一程序。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int a, b;
printf("请输入一个整数:");
scanf("%d", &a);
if (a % 2 == 0)
{
printf("%d不是质数", a);
}
else
{
for (int i = 3; i < a; i += 2)
{
if (a % i == 0)
{
printf("%d不是质数\n", a);
break;
}
if (i == a - 1)
{
printf("%d是质数\n", a);
break;
}
}
return 0;
}
}
注意:该代码有缺陷,在数值比较小的时候验证不出是否为质数,读者仅供参考,可进行优化。
代码都优化(2)
我们知道一个数能被较大的一个数整除会得到较小的整数,例如:99/11=3;84/42=2.然而较大数一定是大于等于被除数的开根号,用这一性质,我们只需在上面的基础上将范围缩小到根号a即可,下面是代码。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int main()
{
int a, b;
printf("请输入一个整数:");
scanf("%d", &a);
b = sqrt(a);
if (a % 2 == 0)
{
printf("%d不是质数", a);
}
else
{
for (int i = 3; i <= b; i += 2)
{
if (a % i == 0)
{
printf("%d不是质数\n", a);
break;
}
else if (i == b||i==b-1)
{
printf("%d是质数\n", a);
break;
}
}
return 0;
}
}
注意:该代码有缺陷,在数值比较小的时候验证不出是否为质数,读者仅供参考,可进行优化。
注:由于b不一定为奇数,但之前我们说过只要验证奇数即可,所以条件为else if (i == b||i==b-1)。
代码优化(3)
我们知道,每一个质数都可以写成6k+(-)1的形式(要想知道证明,去网上查找,这里不在进行证明)通过该方法我们可以快速的时候首先判断是不是复合质数形势,若不符合,则一定不是质数,若是符合则再进行进一步判断,在进行大量数据判断时可以大大减少运算。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
int Primenumberjudgment(int a)
{
if ((a + 1) % 6 == 0 || (a - 1) % 6 == 0)
return 1;
else
{
printf("%d不是质数", a);
return 0;
}
}
int main()
{
int a, b,c;
printf("请输入一个整数:");
scanf("%d", &a);
b = sqrt(a);
c=Primenumberjudgment(a);
if (c == 1)
{
if (a % 2 == 0)
{
printf("%d不是质数", a);
}
else
{
for (int i = 3; i <= b; i += 2)
{
if (a % i == 0)
{
printf("%d不是质数\n", a);
break;
}
else if (i == b || i == b - 1)
{
printf("%d是质数\n", a);
break;
}
}
return 0;
}
}
}
还有一种方法是艾拉托斯特尼筛法(Sieve of Eratosthenes)这个方法更高级一些,可以一次性找出一定范围内的所有质数。它的基本思想是:从2开始,把每个质数的各个倍数都标记为合数,剩下的就是质数。
#include <stdio.h>
#define MAXN 100
void sieveOfEratosthenes(int prime[MAXN])
{
int i, j;
for (i = 2; i <= MAXN; i++)
{
prime[i] = 1;
}
for (i = 2; i * i <= MAXN; i++)
{
if (prime[i] == 1)
{
for (j = i * i; j <= MAXN; j += i)
{
prime[j] = 0;
}
}
}
}
int main() {
int prime[MAXN];
sieveOfEratosthenes(prime);
printf("小于等于%d的质数有:\n", MAXN);
for (int i = 2; i <= MAXN; i++)
{
if (prime[i] == 1)
{
printf("%d ", i);
}
}
return 0;
}
以上就是一些判断质数的基本方法,读者也可以进行优化,找到更优质的代码。