什么是素数?#

素数_一般指_质数。_质数_是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

曾称质数。一个大于1的正整数,如果除了1和它本身以外,不能被其他正整数整除,就叫素数。

要求:输出1~200之间的所有素数。

思路:先定义一个数组,由于不清楚200内素数有多少个,不知道定义多大,但可以肯定不超过200。如果稍微判断,可以肯定不超过100个,因为除了2,所有偶数都不是素数,都可以被2整除。所以,先定义一个数组存放素数,大小100就够,即int a[100]。

循环判断3-199之间的所有数 i ,每次将其循环与2到当前数本身减去1,即 i % j 取余,

如遇到一个可以被整除的,那么i就不是素数,将flag赋值为0,标志当前的i不为素数,以便后面进行判断。且不必再进行判断后面的j了,直接break跳出内循环。

初步代码如下:(有错误)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

int main()
{
int a[100], flag = 1;
for (int i = 3; i < 200; i++) // i为1~200内的整数
{
for (int j = 2; j < i; j++) {
if (i % j == 0) {
flag = 0;
break;
}
}
if (flag == 1) {
int k = 0; //不能再内部赋值,否则每次循环执行时.将会重新赋值
a[k] = i;
k++;
}
}
for (int i = 0; i < 100; i++) //不能直接输出全部,有的并没有值
{
printf("%d ", a[i]);
}
return 0;
}

修正代码如下

注意1、两次循环的初始条件,为什么?

2、flag及k的作用,默认值。

3、每完成一次外循环,就需要将flag重新赋值为1,为什么?

因为循环是默认在flag=1的条件下进行的,循环内的语句可能改变flag的值,再下次循环默认为0的话,将会得出错误结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>

int main()
{
int a[100], flag = 1, k = 1;
a[0] = 2;
for (int i = 3; i < 200; i++) // i为3~200内的整数
{
for (int j = 2; j < i; j++) {
if (i % j == 0) //判断_如果i被j整除了,那么i不是素数,后面不用再循环判断,break跳出循环.
{
flag = 0; // i不是素数
break;
}
}
if (flag == 1) {
a[k] = i;
k++;
}
flag = 1; //每次循环完,将flag重新赋值为1!!!
}
for (int i = 0; i < k; i++) //总共有k个素数
{
printf("%d ", a[i]);
}
return 0;
}

略微修改

输入一个整数,判断是否为素数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>

int main()
{
int a, flag = 1;
printf("请输入一个整数:");
scanf("%d", &a);
for (int j = 2; j < a; j++) {
if (a % j == 0) //判断_如果a被j整除了,那么a不是素数,后面不用再循环判断,break跳出循环.
{
flag = 0; // a不是素数
printf("%d不是一个素数,它能被%d整除", a, j);
break;
}
}
if (flag == 1) {
printf("%d是一个素数", a);
}
return 0;
}