首页 > 其他分享 >素数求解的学习1

素数求解的学习1

时间:2024-09-01 21:21:20浏览次数:12  
标签:求解 int flag 学习 素数 num 整除 循环

素数即质数,它在自然数里的分布是不规律的,但是其在数学研究上占有重要地位。因此对于素数的求解法方法不断被人们优化着。在C语言中求解素数也是非常经典的一道题目,以下简单记录 我学习求解素数的收获。

素数的暴力求解

对与如同我这的初学者,首先学习以素数的基本概念求解素数,先写一个代码判断一个数是否为素数:因为素数只能被1和它本身整除,对于一个数字 num 用2到 num-1 的整数试除 num,如果都不能整除,则 num 为素数,否则不是素数,以下为代码的实现。

 

#include <stdio.h>
int main()
{
	int flag = 1; //假定num为素数 
	int num = 0;
	scanf("%d", &num);
	for (int i = 2; i < num; i++)
	{
		
		if (num % i == 0)
		{
			printf("不是素数\n");
			flag = 0; //如果走到这一步,num不是素数
			break;
		}

	}
	if (flag == 1)
		printf("是素数");
	return 0;
}

这里我们用到了 for 循环对2到 num-1 的数进行了试除,以 flag 作为标记判断 num 是否被整除。若 num 被整除就打印"不是素数",flag 的值被改写为0,然后跳出循环,程序执行完成;

若循环至 i=num ,num 也未被整除,则flag未被改写,打印"是素数"。

这样的方法是判断素数最粗浅的方法,如果求12是否为素数,这里需要进行十次循环,而2就已经能够整除12了,根本不需要后面的运算。如果需要判断的数字越大越多,则会需要进行更多次的循环,无疑会降低计算机的运行效率。 我们试着用这个方法求解101到200的素数,并计算循环的次数,用作后面的对比。

#include <stdio.h>
int main()
{
	int count = 0; //计算内循环次数
	int flag;
	int i = 0;
	for (i = 101; i <= 200; i++)
	{
		
		int j = 0;
		for (j = 2; j < i; j++)
		{
			count++;
			flag = 0;

			if (i % j == 0)
			{
				break;
			}

			flag = 1;
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	printf("\n");
	printf("%d", count);
    return 0;
}

可以看到计算内循环进行了3291次。

试着缩小试除数字的范围1

一.

我们可以轻易判断除2以外素数不可能为偶数,而对于一个数x,如果有(除了自身以外的)质因数,那肯定会小于等于 x/2。以此简单修改代码外循环中的调整部分和内循环中的判断部分。

#include <stdio.h>
int main()
{
	int count = 0;
	int flag;
	int i = 0;
	for (i = 101; i <= 200; i+=2) //i++改为i+=2
	{
		
		int j = 0;
		for (j = 2; j < i/2; j++) //j<i改为j<i/2
		{
			count++;
			flag = 0;

			if (i % j == 0)
			{
				break;
			}

			flag = 1;
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	printf("\n");
	printf("%d", count);
    return 0;
}

对于这次修改外循环次数将近减半,内循环亦然,总体效率提升不算明显。

二.

调动我们的数学知识,因为因数都是成对出现的,如:对于100,可以写成 5 * 20,10 * 10,4 * 25。观察我们可以发现,对于一个数x,如果有(除了自身以外的)质因数,那么它的一个因数必然小于等于它的开平方数√ x。

#include <stdio.h>
#include <math.h> //调用sqrt()引用头文件
int main()
{
	int count = 0;
	int flag;
	int i = 0;
	for (i = 101; i <= 200; i+=2)
	{
		
		int j = 0;
		for (j = 2; j < sqrt(i) ; j++) //将j<i/2改为j<sqrt(i)
		{
			count++;
			flag = 0;

			if (i % j == 0)
			{
				break;
			}

			flag = 1;
		}
		if (flag == 1)
		{
			printf("%d ", i);
		}
	}
	printf("\n");
	printf("%d", count);
	return 0;
}

这时候发现内循环指进行了340,这无疑提高了很多效率。

试着缩小试除数字的范围2

前面提到了除2的偶数都不可能为素数,也可以理解为2的倍数不可能为素数,以此将其排除。以此借鉴筛选法的思路,可以简单改良代码。个位数中2,3,5,7为素数,那么他们的倍数不可能为素数,进一步排除了非素数。

我们可以写一个数组将101到200的数放入,筛出2,3,5,7的倍数,将其赋值为为0,再建立一个数值接收其余数字。结合上面的方法,效率可以在一步提升。代码的实现下一张博客给出。

标签:求解,int,flag,学习,素数,num,整除,循环
From: https://blog.csdn.net/2402_86767488/article/details/141787700

相关文章

  • java开发学习资料集合
    针对java的学习,不同阶段采用的方式是不一样的。本文把java的学习分为入门、实战、进阶三个阶段。下面分开来说技术社区1、 CSDNCSDN在线学习平台,集合了各领域资深技术专家.覆盖领域:人工智能、大数据、区块链、数据库、大学课程、认证考试、系统/网络、游戏开发、Web开发......
  • 研究生深度学习入门的十天学习计划------第二天
    第2天:学习神经网络的构建与基本操作目标:学会使用Python和TensorFlow/Keras构建简单的神经网络模型,理解基本操作和训练过程。2.1选择开发环境并安装依赖在开始动手构建神经网络之前,需要选择一个合适的开发环境并安装相关依赖。常用的开发环境包括JupyterNotebook、Go......
  • Datawhale X 李宏毅苹果书 AI夏令营-跟李宏毅学深度学习(入门)Task3笔记
    目录一、机器学习框架&实践攻略1.总览2.训练误差较大时:    1.模型偏差    2. 优化问题3.训练误差较小时:    1.测试误差较小:    2.测试误差较大:            1.过拟合    2.不匹配一、机器学习框架&实......
  • Redis基础知识学习笔记(二)
    文章目录一.Redis安装1.Windows下安装1>资源管理器目录进入2>目录进入命令:3.配置环境变量2.Linux下安装1>安装redis2>启动redis3>查看redis是否启动二.Redis配置1.查看配置2.编辑配置3.参数说明三.Redis数据类型1.String(字符串)常用命令实例2.Hash(哈希)......
  • 高中文化课学习索引
    高中文化课学习索引语文语文套卷练习记录上海作文笔记拟剧论笔记数学数学套卷练习记录生物生物套卷练习记录......
  • 学习指纹浏览器 处理美团mtgsig1.2 环境检测
    声明:本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!有相关问题请第一时间头像私信联系我删除博客!前言去网上随便找个指纹浏览器默认都有免费10个免费浏......
  • 机器学习(吴恩达) 4
    神经网络/深度学习1.综述        动机:建立软件模仿大脑应用:语音识别到计算机视觉到文本(自然语言过程NLP)        传统机器学习:线性回归,逻辑回归2.需求预测        层:一层可以有多个/一个神经元,以相同或相似特征作为输出,输出几个数字   ......
  • Datawhale X 李宏毅苹果书 AI夏令营 深度学习入门笔记02
    目录一、学习资料二、学习笔记(一)线性模型1、考虑周期性2、修改模型(二)模型变形之分段线性曲线1、分段线性直线2、分段线性曲线的图像和表达式(机器学习第一步:写出带有未知数的函数)(1)如何构成(2)如何表达(3)如何改进3、分段线性曲线的损失(机器学习第二步:定义损失)4、分段......
  • 深度学习与大模型第1课环境搭建
    文章目录深度学习与大模型第1课环境搭建1.安装Anaconda2.修改环境变量2.1修改`.condarc`文件2.2使用AnacondaPrompt修改环境变量3.新建`.ipynb`文件机器学习基础编程:常见问题:深度学习与大模型第1课环境搭建1.安装Anaconda首先,您需要安装Anacon......
  • Datawhale X 李宏毅苹果书 AI夏令营 深度学习进阶笔记02
    目录一、学习资料二、学习笔记(一)自适应学习率(adaptivelearningrate)1、什么是+为什么要用2、三种自适应学习率方法(1)AdaGrad(AdaptiveGradient)(2)RMSprop(RootMeanSquaredpropagation)(3)Adam(Adaptivemomentestimation)(二)学习率调度(learningratescheduling)1、为什么......