更新时间:2023-11-15 11:00:26
你们好,最近小艾特发现有诸多的小伙伴们对于17是质数吗,1是质数吗这个问题都颇为感兴趣的,今天小活为大家梳理了下,一起往下看看吧。
1、1. 先明白什么是质数/素数
2、素数又称为质数,一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫躲何川做质数
3、2. 编程实现:判断一个数是否为质数/素数
4、明白了什么是质数/素数后,我们就要思考如何编程实现其核心算法
5、最简单的是遍历法: 即遍历1到其本身,如果除了1和它本身外(2 - n-1),如果每个数都不能被他整除的话,那么就说明这个数是素数
6、int i, n=7, flag = 0;
7、for (i = 2; i < n; i++)
8、{
9、if (n % i == 0)
10、{
11、flag++;
12、}
13、}
14、if (flag == 0)
15、{
16、printf("%d是质数/素数", n);//表示是素数
17、}
18、else{
19、printf("%d不是质数/素数", n);//表示不是素数
20、}
21、3. 完整可运行代码
22、#include <stdio.h>
23、int main()
24、{
25、int i, n=7, flag = 0;
26、for (i = 2; i < n; i++)
27、{
28、if (n % i == 0)
29、{
30、flag++;
31、}
32、}
33、if (flag == 0)
34、{
35、printf("%d是质暗宿数/素数", n);//表示是素数
36、}
37、else{
38、printf("%d不是质数/素数", n);//表示不是素数
39、}
40、printf("\n");
41、return 0;
42、}
43、4. 程序执行结果
44、请输入一个数:5
45、5是质数/素数
46、请输入一个数:15
47、15不是质数/素数
48、请输入一个数:19
49、19是质数/素数
50、请输入一个数:20
51、20不是质数/素数
52、5. 逻辑优化
53、对一个判读一个数m,
54、上面我们遍历时是直接判断到m-1的,其实判断方法还可以简化。
55、m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ sqrt(m) 之间的每一个整数去除就可以了。
56、如果 m 不能被 2 ~ 间任一整数整除,m 必定是素数。
57、例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
58、原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于sqrt(m) ,另一个大于或等于sqrt(m) 。
59、例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=sqrt(16),因此只需判定在 2~4 之间有无因子即可。
60、代码调整:
61、 #include <math.h> //先引入库文件
62、 for (i = 2; i < n; i++) //然后这里i < n 可以改成i<=sqrt(n)
63、6. 优化后的执行结果仍然无误
64、请输入一个数:2
65、2是质数/素数
66、请输入一个数:45
67、45不是质数/素数
68、请输入一个数:5
69、5是质数/素数
70、请输入一个数:15
71、15不是质数/素数
72、请输入一个数:7
73、7是质数/素数
74、请输入一个数:17
75、17是质数/素数
76、请输入一个数:9
77、9不是质数/素数
78、7. 最后我们扩展下:求101到200之间的素数
79、#include <stdio.h>
80、#include <stdlib.h>
81、#include <string.h>
82、/*
83、判断101到200之间的素数
84、 素数:“素数是指质数,一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;否则称为合数
85、 思路1):因此判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。
86、
87、 思路2):另外判断方法还可以简化。m 不必被 2 ~ m-1 之间的每一个整数去除,只需被 2 ~ sqrt(m) 之间的每一个整数去除就可以了。如果 m 不能被 2 ~ 间任一沟阅整数整除,m 必定是素数。例如判别 17 是是否为素数,只需使 17 被 2~4 之间的每一个整数去除,由于都不能整除,可以判定 17 是素数。
88、
89、 原因:因为如果 m 能被 2 ~ m-1 之间任一整数整除,其二个因子必定有一个小于或等于sqrt(m) ,另一个大于或等于sqrt(m) 。例如 16 能被 2、4、8 整除,16=2*8,2 小于 4,8 大于 4,16=4*4,4=sqrt(16),因此只需判定在 2~4 之间有无因子即可。
90、
91、
92、*/
93、void main()
94、{
95、int n,i,j,flag=0,sum=0;
96、printf("素数:");
97、for(i=101;i<=200;i++){
98、flag=0;
99、for(j=2;j<i;j++){ //这里j<i可以改成<=sqrt(i)
100、if(i%j==0) {
101、flag=1;
102、}
103、}
104、if(flag==0){
105、sum++; //表示是素数
106、printf("%d,",i);
107、}
108、}
109、printf("\n共有素数%d个\n",sum);
110、}
111、8.求101到200之间的素数/质数执行结果
112、素数:101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,
113、共有素数21个
以上就是1是质数吗这篇文章的一些介绍,希望对大家有所帮助。