目录
一、代码演示:
#include<stdio.h>
int main()
{
int y = 0;
for (y = 100; y <= 200; y++)
{
int n = 0;
int flag = 1;
for (n = 2; n<y ; n++)
{
if (y % n == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", y);
}
}
return 0;
}
二、结果演示:
三、代码讲解:
注意:
素数也叫质数。
素数是指只能被1和它本身整除的数字。
所以判断条件是:拿2到y-1的数字去试除y看能否被整除。
根据某一数据(flag)的状态变化来作为标志进行判断。
#include<stdio.h>
int main()
{
int y = 0;
//int n = 0;
//int flag = 1;
for (y = 100; y <= 200; y++)//产生100-200的数
{
//判断y是否为素数
//拿从2到y-1的数字去试除y就行。
int n = 0;
int flag = 1;//假设y是素数,表示当前的一种状态。
//产生2到y-1的数字(n)
for (n = 2; n < y; n++)
{
if (y % n == 0)//若错写if (y / n == 0),结果相差很大
{
flag = 0;//y不是素数,若写成flag==0是错误的。
break;
}
}
//注意:printf放的位置,是在第二个for循环结束后,因为要随着n++去一个一个试除
//break跳出来来到这
if (flag == 1)
{
printf("%d ", y);
}
}
return 0;
}
注意:
int n = 0;
int flag = 0;这两行代码所放的位置,在第一个for循环后,第二个for循环之前。
若这两行代码放到第一个for循环前,没有数字输出;
(变量的销毁和重建)
若计算统计一下打印的个数:
#include<stdio.h>
int main()
{
int y = 0;
int count = 0;//(用来计算统计打印的个数)
for (y = 100; y <= 200; y++)//产生100-200的数
{
//判断y是否为素数
//拿从2到y-1的数字去试除y就行。
int n = 0;
int flag = 1;//假设y是素数,表示当前的一种状态。
for (n = 2; n < y; n++)//产生2到y-1的数字(n)
{
if (y % n == 0)
{
flag = 0;//y不是素数,若写成flag==0是错误的。
break;
}
}
//break跳出来来到这
if (flag == 1)
{
printf("%d ", y);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
四、一种常见的优化方法:
“拿2到y-1的数字去试除y看能否被整除”——>优化
若y = a*b,则a和b中至少有一个数字是<=的。
如:16=2*8 16=4*4。
如果要看16能否被2-15的数字整除,2能整除16的时候就没有必要找8了。所以如果在之前,没有找到一个数字能整除16,那么在
之后也就不能找到另外一个数字能整除16了。比如17这个数字,在开平方后是4,在2,3,4的范围内不能找到一个数字能够整除17,那么就不可能在5的后面找到一个数字能整除17。
所以基于以上分析,代码可以得到优化,试除时范围就缩小了。
在C语言中有sqrt()函数可以开平方。对y进行开平方就是:sqrt(y)
sqrt()函数是数学函数,所以需要引头文件:<math.h>
代码实现:
#include<stdio.h>
#include<math.h>
int main()
{
int y = 0;
int count = 0;
for (y = 100; y <= 200; y++)
{
int n = 0;
int flag = 1;
for (n = 2; n <=sqrt(y); n++)//是小于等于了。
{
if (y % n == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", y);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
代码还可以优化:偶数没有必要判断,偶数肯定不是素数,奇数才有可能是素数。
所以初始值和递增的数字变动一下——效率高:
#include<stdio.h>
#include<math.h>
int main()
{
int y = 0;
int count = 0;
for (y = 101; y <= 200; y+=2)
{
int n = 0;
int flag = 1;
for (n = 2; n <=sqrt(y); n++)
{
if (y % n == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
{
printf("%d ", y);
count++;
}
}
printf("\ncount=%d\n", count);
return 0;
}
还可以去掉3的倍数,5的倍数等等优化。
可以后期翻看网上的一片文章:《素数求解的n种境界》
——目的是:算法的不断优化
写一个函数,判断一个数是不是素数:(根据输入值判断)
//思路:
//返回值:0表示不是素数,1表示是素数
#include <stdio.h>
#include <math.h>
int is_prime(int n)
{
int i = 0;
for (i = 2; i <= sqrt(n); i++)
{
if (0 == n % i)
{
return 0;
}
}
return 1;
}
int main()
{
int m = 0;
scanf("%d", &m);
int len = is_prime(m);
if (1 == len)
{
printf("是素数\n");
}
return 0;
}
则:打印100-200之间的素数,用函数:
#include<stdio.h>
#include<math.h>
is_prim(int n)//用n来接收i,i是整型
{
//判断n是否为素数
//试除
//用n除以2到n-1的数字
//产生2到n-1的数字——用for循环
int j = 0;
for (j = 2; j <= sqrt(n); j++)//如果在小于等于开平方n时能找到一个因子能整除n那n就不是素数;如果找不到,那另外一端大于开平方n也不可能找到一个因子能整除它。需要引用头文件
{
//试除判断——用if
if (n % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
//出现100-200之间的数字——用for循环
int i = 0;
for (i = 100; i <= 200; i++)
{
//判断——用if,函数实现,传i,得到的结果返回是0说明不是素数,返回1说明是
if (is_prim(i) == 1)
{
printf("%d ", i);
}
}
return 0;
}
去掉注释后看:
#include<stdio.h>
#include<math.h>
is_prim(int n)
{
int j = 0;
for (j = 2; j <= sqrt(n); j++)
{
if (n % j == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++)
{
if (is_prim(i) == 1)
{
printf("%d ", i);
}
}
return 0;
}