素数是只能被1和它本身整除的数
首先我们看一下如何判断一个数是否是素数
判断素数
#include <stdio.h>
//判断一个数是否为素数,只要在 2 ~ n-1 中找到能被n整除的数,那么数字n就是合数,反之就是素数
int is_prime(int n) {
for (int i = 2; i < n; i++) {
if (n % i == 0) return 0;//找到能整除的数i,返回0
return 1;//没找到能被n整除的数,返回1
}
}
int main() {
int n;
//循环读入,判断输入的数是否是素数
while (~scanf("%d", &n)) {
printf("%s\n", is_prime(n) ? "Yes" : "No");
}
}
**
利用素数筛,遍历出100以内的素数
#include <stdio.h>
#define MAX_N 100
int prime[MAX_N + 5];//在全局区定义的数组,各位默认为0
void init() {
for (int i = 2; i <= MAX_N; i++) {
if (prime[i]) continue;//如果prime[i] = 0 证明该项位置是素数
prime[++prime[0]] = i;//利用prime[0]计素数个数
for (int j = i; j <= MAX_N / i; j++) {
prime[i * j] = 1;//利用素数标记合数
}
}
}
int main() {
init();
for (int i = 1; i <= prime[0]; i++) {
printf("%d\n", prime[i]);
}
return 0;
}
求100以内的最小素因子
#include <stdio.h>
#define MAX_N 100
int prime[MAX_N + 5];//在全局区定义的数组,各位默认为0
void min() {
for (int i = 2; i <= MAX_N; i++) {
if (prime[i]) continue;//如果prime[i] = 0 证明该项位置是素数
for (int j = 2 * i; j <= MAX_N; j += i) {
if (prime[j]) continue;//如果prime[j] 被标记过就调回上一步,j = j + i
prime[j] = i;//素数的最小素因子是它本身;它标记过的合数的最小素因子就是它本身
}
}
}
int main() {
min();
for (int i = 2; i <= MAX_N; i++) {
printf("min_fac[%d] = [%d]\n", i, prime[i]);
}
return 0;
}
求100以内的最大素因子
#include <stdio.h>
#define MAX_N 100
int prime[MAX_N + 5];//在全局区定义的数组,各位默认为0
void max() {
for (int i = 2; i <= MAX_N; i++) {
if (prime[i]) continue;//如果prime[i] = 0 证明该项位置是素数
for (int j = 2 * i; j <= MAX_N; j += i) {
//相比较找最小素因子,这里省略了判断prime[j] 是否被标记过,所以会出现重复标记的情况,最后一次标记的就是最大素因子
prime[j] = i;
}
}
}
int main() {
max();
for (int i = 2; i <= MAX_N; i++) {
printf("max_fac[%d] = [%d]\n", i, prime[i]);
}
return 0;
}