设计C语言程序,输出所有小于等于n(n为一个大于2的正整数,比如100)的素数,要求: (1)每行输出10个素数;(2)尽可能采用较优算法。
时间: 2024-01-01 08:07:03 浏览: 58
C程序设计-求100以内所有素数.doc
以下是一个使用筛法(埃氏筛法)的 C 语言程序,可以实现输出小于等于 n 的所有素数,每行输出 10 个素数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
void printPrime(int n) {
bool *prime = (bool*) malloc(sizeof(bool) * (n + 1)); // 分配空间
for (int i = 2; i <= n; i++) {
prime[i] = true; // 初始化为 true
}
int count = 0; // 计数器,每行输出 10 个素数
for (int i = 2; i <= sqrt(n); i++) { // 只需要遍历到 sqrt(n)
if (prime[i]) {
for (int j = i * i; j <= n; j += i) { // 将 i 的倍数标记为非素数
prime[j] = false;
}
}
}
for (int i = 2; i <= n; i++) {
if (prime[i]) {
printf("%d ", i);
count++;
if (count % 10 == 0) { // 每行输出 10 个素数
printf("\n");
}
}
}
printf("\n");
free(prime); // 释放空间
}
int main() {
int n = 100;
printPrime(n);
return 0;
}
```
该程序使用了一个 bool 类型的数组 prime,用于标记每个数是否为素数。初始时,将所有数都标记为素数。然后从 2 开始遍历到 sqrt(n),如果当前数为素数,则将其倍数标记为非素数。最后再遍历一遍数组,输出所有标记为素数的数,每行输出 10 个。这个算法的时间复杂度为 O(n log log n)。
阅读全文