文章目录
1.在C语言中,判断质数的常见算法有以下几种:
试除法(暴力算法):从2开始依次除以每个小于该数的自然数,如果有余数为0的,则该数不是质数。
优化试除法:只需要测试小于等于该数平方根的自然数,因为如果大于该数平方根的除数能整除该数,那么小于该数平方根的除数一定也能整除该数。
埃拉托色尼筛法:从2开始,将数字的倍数都标记为合数,就可以找到所有的质数。
米勒-拉宾素性检验:依靠不同的随机数,可以判断质数是否为合数,准确率高。
线性筛法:从小到大依次筛选质数,并标记其倍数为合数。
试除法(暴力算法):
素性检验
1.1.试除法(暴力算法):
#include <stdio.h>
int isPrime(int n)
{
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return 0; // 不是质数
}
}
return 1; // 是质数
}
int main()
{
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (isPrime(n)) {
printf("%d是质数\n", n);
} else {
printf("%d不是质数\n", n);
}
return 0;
}
1.2.优化试除法:
#include <stdio.h>
#include <math.h>
int isPrime(int n)
{
for (int i = 2; i <= sqrt(n); i++)
{
if (n % i == 0)
{
return 0; // 不是质数
}
}
return 1; // 是质数
}
int main()
{
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (isPrime(n)) {
printf("%d是质数\n", n);
} else {
printf("%d不是质数\n", n);
}
return 0;
}
1.3.埃拉托色尼筛法:
#include <stdio.h>
void eratosthenes(int n)
{
int prime[n + 1];
for (int i = 2; i <= n; i++)
{
prime[i] = 1;
}
for (int i = 2; i * i <= n; i++)
{
if (prime[i])
{
for (int j = i * i; j <= n; j += i)
{
prime[j] = 0;
}
}
}
printf("2");
for (int i = 3; i <= n; i += 2)
{
if (prime[i])
{
printf(", %d", i);
}
}
printf("\n");
}
int main()
{
int n;
printf("请输入一个整数:");
scanf("%d", &n);
if (1 == n)
{
printf("1不是质数\n");
return 0;
}
printf("%d以内的所有质数:\n", n);
eratosthenes(n);
return 0;
}
1.4.米勒-拉宾素性检验:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
long long power(long long