c语言使用较快的方法输出1 到N 间的素数。 输入格式: 输入一个正整数n。(1<n<=1000000) 输出格式: 输出小于等于n的所有素数,每个素数以空格隔开 输入样例: 在这里给出一组输入。例如: 10 输出样例: 在这里给出相应的输出。例如: 2 3 5 7
时间: 2024-06-06 09:11:49 浏览: 30
以下是C语言代码实现,使用筛法求素数:
#include <stdio.h>
#include <stdlib.h>
void sieve(int n) {
int *is_prime = (int*)malloc(sizeof(int) * (n+1)); // 标记数组
for (int i = 2; i <= n; i++) {
is_prime[i] = 1; // 初始化为素数
}
for (int i = 2; i*i <= n; i++) {
if (is_prime[i]) { // i是素数,那么i的倍数一定不是素数
for (int j = i*i; j <= n; j += i) {
is_prime[j] = 0;
}
}
}
for (int i = 2; i <= n; i++) {
if (is_prime[i]) {
printf("%d ", i);
}
}
printf("\n");
free(is_prime);
}
int main() {
int n;
scanf("%d", &n);
sieve(n);
return 0;
}
当输入10的时候,输出结果为:2 3 5 7
相关问题
使用较快的方法输出1 到N 间的素数。 输入格式: 输入一个正整数n。(1<n<=1000000) 输出格式: 输出小于等于n的所有素数,每个素数以空格隔开 用c语言完成
以下是使用埃氏筛法(Eratosthenes sieve)的C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>
void find_primes(int n) {
bool *is_prime = (bool*) malloc((n+1) * sizeof(bool)); // 动态分配数组空间
int i, j;
for (i = 2; i <= n; i++) {
is_prime[i] = true; // 初始化数组
}
int limit = sqrt(n);
for (i = 2; i <= limit; i++) {
if (is_prime[i]) {
for (j = i * i; j <= n; j += i) {
is_prime[j] = false; // 将i的倍数标记为合数
}
}
}
for (i = 2; i <= n; i++) {
if (is_prime[i]) {
printf("%d ", i); // 输出素数
}
}
free(is_prime);
}
int main() {
int n;
scanf("%d", &n);
find_primes(n);
return 0;
}
```
该程序首先使用动态分配数组的方式初始化一个大小为 n+1 的布尔类型数组,初始值全部设为 true。根据素数的定义,我们只需要从 2 开始枚举到 sqrt(n)(即 n 的平方根)即可,因为若一个数 i 不是素数,则它一定可以分解成 i = p * q 的形式,其中 p 和 q 都是小于 i 的数,因此至少有一个数小于等于 sqrt(i)。对于每个素数 i,我们将其所有的倍数都标记为合数,这样就可以筛选出所有的素数。最后再遍历一次数组,输出所有标记为 true 的位置对应的数即可。
该算法的时间复杂度是 O(nloglogn),空间复杂度是 O(n)。因此,在 n 较大时,该算法的效率更高。
写一个c语言程序:输入n个正整数,输出其中的素数。
好的,以下是一个从输入n个正整数中筛选出素数的C语言程序:
```c
#include <stdio.h>
int main() {
int n, i, j, num[100], flag;
printf("请输入要输入的正整数个数:");
scanf("%d", &n);
printf("请输入%d个正整数:", n);
for (i = 0; i < n; i++) {
scanf("%d", &num[i]);
}
printf("筛选出的素数有:");
for (i = 0; i < n; i++) {
flag = 0;
for (j = 2; j <= num[i] / 2; j++) {
if (num[i] % j == 0) {
flag = 1;
break;
}
}
if (num[i] == 1) {
continue;
}
else {
if (flag == 0) {
printf("%d ", num[i]);
}
}
}
printf("\n");
return 0;
}
```
程序流程如下:
1. 提示用户输入要输入的正整数的个数。
2. 通过scanf函数读取用户输入的正整数个数。
3. 提示用户输入n个正整数,并通过循环读取到num数组中。
4. 循环遍历num数组中的每一个数,判断是否是素数,如果是素数则输出该数。
5. 如果该数是1,则跳过该数的判断。
6. 输出筛选出的素数。
希望能帮到您!
相关推荐
![c](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)