打印100~200之间的素数(写一个函数,判断一个数是不是素数)

发布于:2022-12-22 ⋅ 阅读:(536) ⋅ 点赞:(0)

目录


一、代码演示:

二、结果演示:

三、代码讲解:

四、一种常见的优化方法:

写一个函数,判断一个数是不是素数:(根据输入值判断)



一、代码演示:

#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中至少有一个数字是<=\sqrt{y}的。

如:16=2*8       16=4*4。

如果要看16能否被2-15的数字整除,2能整除16的时候就没有必要找8了。所以如果在\sqrt{16}之前,没有找到一个数字能整除16,那么在\sqrt{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;
}

网站公告

今日签到

点亮在社区的每一天
去签到