素数,如何用代码实现?

素数(质数)是指只能被拆成"1"和"它自身"乘积的正整数。用数学语言表述就是:

a 为正整数 , 若对于任意 b,c  ( b,c 是正整数且可以相等),a != b*c,则 a 为素数,反之也成立。

如何用代码实现呢?       今天小编就告诉大家。

例如:打印100 - 200 之间的素数

思路如下:

  1. 循环产生100 - 200 之间的数字,假定为 i 
  2. 判断 i 是否为素数 (用 2 至 i-1 之间的数字 / i ,若都不能整除,则是素数)
  3. 若 i 是素数,则打印

一.非函数的解决方法

1.直接

#include<stdio.h>​

int main()
{
    for(int i = 100; i <= 200; i++)  // 思路 1
    {
        int flag = 1;  // 用于接收 i 是否为素数的信号
        for(int j = 2; j <= i - 1; j++)  // 思路 2
        {
            if(i % j == 0)
            {
                flag = 0; // 如果有被整除的,就不是,就不需要再判断了,所以跳出循环
                break;    // 这个 i 被 flag 标记为假
            }
        }
        if(flag == 1)  // 没有被标记为假的就是素数,打印
            printf("%d ", i);
    }

    return 0;
}

​

2.算法优化

我们发现 所有偶数都不可能是素数,那是不是可以将所有偶数都剔除,只判断奇数,进而提高代码效率呢?

这里我们只需要将第一个 for 循环中的 i++    改为 i+=2 ,同时改变 i 的值即可

3.算法再优化

我们发现:如果 a = b * c (a,b,c 均为整数) ,则 b, c 一定有一个小于根号下a。进而我们可以再优化代码

要求根号,就得请出 开平方的库函数—— sqrt

既然是库函数,就要包含头文件,这个函数的头文件是 #include<math.h>

#include<stdio.h>
#include<math.h>

int main()
{
    for(int i = 101; i <= 200; i+=2) // 算法优化
    {
        int flag = 1;
        for(int j = 2; j <= sqrt(i); j++) // 算法再优化
        {
            if(i % j == 0)
            {
                flag = 0;
                break; 
            }
        }
        if(flag == 1)
            printf("%d ", i);
    }

    return 0;
}

    二.函数的解决方法

    综合逻辑的算法以及优化都与上面相似

    #include<stdio.h>
    #include<math.h>
    
    int is_prime(int i)
    {
    	for (int j = 2; j <= sqrt(i); j++)
    	{
    		if (i % j == 0)
    		{
    			return 0;  // 不是素数
    		}
    	}
    	return 1;  // 是素数
    }
    
    int main()
    {
    	for (int i = 101; i <= 200; i+=2)
    	{
    		if (is_prime(i))
    			printf("%d ", i);
    	}
    	return 0;
    }

    三.运行结果

    本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注

    小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。

    如果有建议欢迎在评论区或私信留言,小编才能发布更优秀的文章。感谢您的大力支持。