[C语言]输出100以内的所有素数(质数)

  • Post author:
  • Post category:其他




  1. 概念解读 :

质数又被称为素数,是指一个大于1的自然数,除了1和它自身外,不能被其它自然数整除,且其个数是无穷的。



  1. 思路分析:

对于代码大方向,我们可以直接主函数中写,也可以用可移植性高的自定义函数来写。

100以内样例输出示意

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

后面是大于100的素数,可以修改代码中的循环条件的范围来改变自己的输出



  1. 代码内容:


思路一:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int i ,j;                            //定义变量循环 
    printf("打印100以内所有素数:\n");      
    for(i = 2;i <= 100; i++){        //外循环从2遍历到100,可以修改范围输出不同范围内的素数 
        for(j = 2;j < i; j++){            //内循环通过大于1小于自身的因数进行依次取余判断,直到相除没有余数,跳出循环。 
            if(i % j == 0){
                break;
            }
        }
        if(j == i){        //这个判断是重点,意思是在前面的条件成立的前提下除数和被除数相等的才为素数,例如12有3×4,但是不相等,例如13只有当i==j是即i==j==13时候才能成立 
            printf("%d  ",i);
        }
    }    
    return 0;
}

代码分析:通过二重循环,外循环从2遍历到100,可以修改范围输出不同范围内的素数,内循环通过大于1小于自身的因数进行依次取余判断,直到相除没有余数,跳出循环。这个判断是重点,意思是在前面的条件成立的前提下除数和被除数相等的才为素数,例如12有3×4,但是不相等,例如13只有当i==j是即i==j==13时候才能成立 。


思路二:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdbool.h>
bool isprime(int i)                    //判断是否是素数的自定义函数 
{                                    
    int j;                            
    for(j = 2; j < sqrt(i); j++){    //for循环判断如果不是素数则返回0 
        if(i%j == 0){                //如果在i的平方根范围内的所有数字都不能被整除就说
                                    //明这个数字是素数,但凡有一个能被整除那么这个数字就违背了素数的定义 
            return 0;
        }
    }
    return 1;                        //如果是素数则返回1 
} 
int main() {
    int i ,j;                            
    printf("打印100以内所有素数:\n");      
    for(i = 2;i <= 100; i++){        //for循环遍历一个一个判断,如果是素数那么就打印出来,遍历的数字范围能被修改,输出不同范围的素数 
            if(isprime(i)){
                printf("%d ",i);
            }
    }    
    return 0;
}

代码分析:非素数一定是由两个数字相乘所得,所以另一种思路即为sqrt()函数对除数开平方根,对其开平方根后的数字对于素数来说一定是最大的平方根,一个数字分解为任意两个乘数一定是小于等于其开平方根的数值的,所以我们循环条件只需要小于这个数字的开平方根的数字即可;被除数则小于被判断数字的开方根的数字,最后经过判断,如果在有返回值的即为素数,这种方法可以使用可移植性较高的自定义函数完成。

以上就是我对100以内输出素数的所有见解,如果不同见解可以私信我



版权声明:本文为m0_68165475原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。