方法一:挨个遍历 从1-1000都试一次 -----通俗易懂的方法

#include<stdio.h>
#include<time.h>
bool IsPrime(int n) 
{
    int i;
    if (n <= 1) 
    {
        return false;
    }
    if (n == 2) 
    {
        return true;
    }
    for (i = 2; i < n; i++) 
    {
        if (n % i == 0) return false;
    }
    return true;
}
int main() 
    {
    int n, i;
    int t1 = clock();
    for (i = 0; i <= 1000; i++) 
    {
        if (IsPrime(i)) printf(" %d ", i);
    }
    int t2 = clock();
    printf("\n运行时间:%d\n", t2 - t1);
    return 0;
}

代码运行结果如下:

 

方法二:使用奇数的思想

核心思想:除了2以外那些2的倍数(4、6、8、10、12、14、18·······)都不是质数

代码示例如下:

#include <stdio.h>
int main()
{
    int x = 0;
    int i = 0;
    unsigned int count = 0;
    x = 2;
    printf("%d ", x);   
    for (x = 3; x < 1000; x += 2)  
    {
        for (i = 2; i < x; i++)
        {
            count++;
            if (x % i == 0)
            {
                break;
            }
        }
        if (x == i)
        {
            printf("%d ", x);
        }
    }
    printf("\n\n\n");
    printf("运算的次数:%d ", count);
    return 0;
}

运行结果如下:

 

方法三:同时使用奇数和偶数来实现

核心思想:所以除了2以外质数一定是奇数

代码示例如下:

#include <stdio.h>
int main()
{
    int x = 0;
    int i = 0;
    unsigned int count = 0;
    x = 2;
    printf("%d ", x);
    for (x = 3; x < 1000; x += 2)  //两层for循环均只产生奇数
    {
        for (i = 3; i < x; i += 2)  //控制第二层for循环不再自增1,而是从3开始自增2
        {
            count++;
            if (x % i == 0)
            {
                break;
            }
        }
        if (x == i)
        {
            printf("%d ", x);
        }
    }
    printf("\n\n\n");
    printf("运算的次数:%d ", count);
    return 0;
}

代码运行结果如下:

 

方法四:平方根sqrt方法实现

代码示例如下:

#include<stdio.h>
#include<time.h>
#include<math.h>
int IsPrime(int n) 
{
    int i;
    if (n % 2 == 0) return 0;
    for (i = 3; i <= sqrt(n); i += 2) 
    {
        if (n % i == 0) return 0;
    }
    return 1;
}
int main() {
    int n, i;
    int t1 = clock();
    printf(" 2 ");
    for (i = 3; i <= 1000; i++) 
    {
        if (IsPrime(i)) printf(" %d ", i);
    }
    int t2 = clock();
    printf("\n运行时间:%d\n", t2 - t1);
}

代码运行结果如下:

 

方法五:使用数组的方法实现

代码示例如下:

#include <stdio.h>
int main()
{
    int arr[500] = { 0 };
    int x = 0;
    int i = 0;
    unsigned int count = 0;
    int sum = 0;  //定义数组的下标
    arr[sum] = 2;  //把2存到数组中
    sum++;
    arr[sum] = 3;   //把3存到数组中
    sum++;
    for (x = 5; x < 1000; x += 2)
    {
        for (i = 0; i < sum; i++)//从下标0开始遍历,直到数组的最后一个质数
        {
            count++;
            if (x % arr[i] == 0)
            {
                break;
            }
        }
        if (sum == i)  //遍历后都不能整除
        {
            arr[sum] = x;  //把质数保存到数组中
            sum++;   //下标加1,为下次放做准备
        }
    }
    for (i = 0; i < sum; i++)//使用for循环进行输出
    {
        printf("%d ", arr[i]);
    }
    printf("\n\n\n");
    printf("运算的次数:%d ", count);
    return 0;
}

代码运行结果如下:

 

方法六:筛选法(空间换时间)

思路:把2到n中的所有数都列出来,然后从2开始,先筛去n内所有2的倍数,然后每次从下一个剩下的数(必然为质数)开始,筛去其n内所有的倍数,最后剩下的数都是质数

代码示例如下:


//1.设置一个数组a[],a[i]的值为1表示i为质数,将所有元素初始化为1

//2.筛去m的倍数,即把a[2*m]、a[3*m]…置为0

//3.输出a[i]值为1的i。
#include<stdio.h>
#define MAX 1000
int s;
int a[MAX];
void prime()
{
    s = 1;
    for (int i = 0; i <= MAX; i++)
        a[i] = 1;
    a[0] = a[1] = 0;
    for (int i = 2; i <= MAX; i++)
    {
        if (a[i])
            a[s++] = i;
        for (int j = i * 2; j <= MAX; j += i)
            a[j] = 0;
    }
}
int main()
{
    prime();
    for (int i = 1; i < s; i++)
        printf("%d ", a[i]);
    return 0;
}

代码运行结果如下:

 

编者注:以上对本小题的代码编写的多种方法,欢迎大家收藏借鉴并转发;

               以上代码仅供参考,如有问题欢迎大家在留言区批评指正;

               版权所有,翻印必究,如有雷同纯属巧合,转载请注明出处。

               By CRH380AJ2808 2022.04.27


————————————————
版权声明:本文为CSDN博主「CRH380AJ2808」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JH13thpig/article/details/124440215

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐