求解素数环问题

注:这里我的代码是以第一位为最大数n为首元素不动的

思路:

首先我们分析问题要以较小规模的样例进行分析,例如n=3时

第一步:深入搜索

我们先不管后面怎么样,当前的首要目标是先确定第一个元素的值,可知有三个选择:1,2,3

当我们从1这个分支开始时,我们也不管后面的怎么样,当前的首要目标是先确定第二个元素的值,可知此时有两个选择:2,3

当我们继续从2这个分支开始时,这时我们只剩一个确定选择:3

上诉所有的步骤就是深入搜索,即选了其中一个选择后,在该选择的分支下,继续选择

第二步:回溯

例如当我们a[0]选择1时,a[1]不是2就是3,选择2时,发现暂时还符合素数环条件,可以继续深入探索,选择3时,发现此时已经不符合素数环条件,我们就没必要继续深入搜索了,同时要退出a[1]=3的分支

也就是说

我们每进行一次选择,如果此时符合素数环的条件,就继续选择,如果当前选择已经不符合素数环的条件,则说明我们已经没必要在该选择的分支下继续选择了,因此我们就应该退出该选择,换一条选择的分支继续搜索

这就是回溯

第三步:实现深入搜索和回溯

一方面我们深入搜索后,如果发现符合相关条件,那么我们就继续深入搜索,如果发现不符合相关条件,那么我们就回溯,其思想几乎与递归非常相似,因此我们应该用递归实现深入搜索和回溯

第四步:实现相关条件的函数

我们的深入搜索不能没条件限制一直深入搜索下去,就像递归不能永远递归下去,不然就陷入死循环了。因此我们要设置相关条件,如果不符合条件就回溯,由题意我们可知,条件一共有三:

1.前后元素的和的值必须为素数

2.前面选择的值,后面不能重复

3.首尾的和也要为素数

实现这些代码就很简单了

答案(第一位固定为n):

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<math.h>
int n = 0;
int* p;
bool ans = false;
bool isPrime(int x)     //判断是否是素数 
{
	if (x < 2)   //1不是素数
	{
		return false;
	}
	for (int i = 2; i <= sqrt(x * 1.0); i++)  //优化算法
	{
		if (x % i == 0)   //如果有其他因子
		{
			return false;   //不是素数
		}
	}
	return true;   //是素数
}
bool exist(int p[], int begin, int end, int x)   //寻找数组a[begin..end]已经存在过x,则返回flase;反之,返回true 
{
	for (int i = begin; i <= end; i++)
	{
		if (p[i] == x)
		{
			return false;
		}
	}
	return true;
}
void prt(int p[], int n)    //打印素数环
{
	int i;
	for (i = 0; i <= n - 1; i++)
	{
		printf("%d ", p[i]);
	}
	printf("\n");
	return;
}
void fill(int k, int p[])  //求素数环函数
{
	if (k == n)    //如果是素数环的最后一位
	{
		if (isPrime(p[0] + p[k - 1]))  //如果首尾也是素数
		{
			ans = true;    //符合素数环要求
			prt(p, n);
		}
		return;
	}
	for (int i = n; i >= 1 && !ans; i--)    //从
	{
		if (isPrime(p[k - 1] + i) && exist(p, 0, k - 1, i))  //如果既符合前后和是素数 && 前面没出现重复
		{
			p[k] = i;   //将这个符合条件的数填入
			fill(k + 1,p);  //深入搜索
		}
	}
	return;   //回溯
}
int main()
{ 
	printf("请输入n的值:\n");
	scanf("%d", &n);
	p = (int*)calloc(n, sizeof(int));  //申请空间并且都初始化为0
	p[0] = n;    //让数组第一位为最大值
	fill(1, p);   //从1开始进入深入搜索
	if (ans != true)
	{
		printf("无解\n");
	}
	free(p);   //最后归还申请空间
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

paddlehub的简单应用

1、下载安装 pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple 报错&#xff1a; Collecting onnx<1.9.0 (from paddle2onnx>0.5.1->paddlehub)Using cached https://pypi.tuna.tsinghua.edu.cn/packages/73/e9/5b953497c0e36df589fc60cc6c6b35…

Java中集合概述(补充ing)

一、集合分类 Java中的集合框架提供了多种类型的集合&#xff0c;主要分为两大类&#xff1a;单列集合&#xff08;只保存单一类型的对象&#xff09;和双列集合&#xff08;保存具有键值对关系的对象&#xff09;。下面对这些集合进行分类介绍&#xff0c;但由于源码分析会涉…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…

沉浸式翻译 chrome 插件 Immersive Translate - Translate Website PDF

免费翻译网站&#xff0c;翻译PDF和Epub电子书&#xff0c;双语翻译视频字幕 &#x1f4e3; 网络上口碑爆炸的网站翻译扩展工具【沉浸式翻译】⭐⭐⭐⭐⭐ &#x1f4bb; 功能特点如下&#xff1a; &#x1f4f0; 网站翻译 &#x1f680; 提供双语网站翻译&#xff0c;智能识…

618科技嘉年华!五款极致科技产品,开启智能生活新篇章!

准备好迎接一年一度的618了吗&#xff1f;这不仅仅是一场购物的狂欢&#xff0c;更是一次科技的盛宴&#xff0c;一次智能生活的全新启航。今年&#xff0c;我们将带来五款令人瞩目的极致科技产品&#xff0c;它们将彻底颠覆你对智能生活的认知。从娱乐到工作&#xff0c;这些产…

【Node.js工程师养成计划】之原生node开发web服务器

一、使用node创建http服务器 var http require(http);// 获取到服务器实例对象 var server http.createServer() server.listen(8080, function() {console.log(http://127.0.0.1:8080); })server.on(request, function(req, res){console.log(request);res.write(6666666688…

《微服务设计》读书笔记

此为阅读纽曼《微服务设计》一书后总结的读书笔记&#xff0c;点此处下载PDF文档。 一、微服务的概念 微服务&#xff08;或称微服务架构&#xff09;是一种云原生架构方法&#xff0c;其核心思想在于将单个应用拆分为众多 小型、松散耦合的服务&#xff0c;服务之间均通过网…

百度语音识别的springboot应用

1、pom依赖 <dependency> <groupId>com.baidu.aip</groupId> <artifactId>java-sdk</artifactId> <version>4.16.18</version> </dependency> 2、测试的demo 创建语音识别应用 百度智能云-管理中心 (baidu.com) 代码中要…

十大USDT交易平台大全XEX交易所

USDT是一种基于比特币区块链网络的加密代币&#xff0c;主要运用于数字货币交易平台&#xff0c;以稳定币为主。USDT的核心价值在于其与真实货币的固定兑换比率1:1&#xff0c;所以被称为Tether。随着加密货币市场的不断壮大&#xff0c;越来越多的交易平台开始支持USDT&#x…

Android 设置头像 - 裁剪及圆形头像

书接上文 Android 设置头像 - 相册拍照&#xff0c;通过相册和照片的设置就可以获取到需要的头像信息&#xff0c;但是在通常情况下&#xff0c;我们还想要实现针对头像的裁剪功能和圆形头像功能。 先上截图&#xff1a; 图像裁剪 通常裁剪可以分为程序自动裁剪和用户选择裁剪…

上位机图像处理和嵌入式模块部署(树莓派4b设置ftp下载)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 作为一个开发板&#xff0c;最好支持ftp下载&#xff0c;这样文件的上传和下载都会比较方便。虽然目前为止&#xff0c;利用mobaxterm和ssh也能实现…

8.11 分析工具 8.14 设计工具

一、分析工具 &#xff08;一&#xff09;结构化分析 1、数据流图&#xff08;DFD&#xff09; &#xff08;1&#xff09;数据流图 从数据传递、加工的角度&#xff0c;以图形刻画系统内的数据运动情况。全面描述系统逻辑模型的工具。通过符号&#xff0c;表示出数据流动、…

C++中的数据结构与算法

随处可见的红黑树 一般会用到[key,value]。 例如github中这个例子&#xff0c;第一个是访问网站&#xff0c;第二个是访问次数&#xff0c;但是这个不是静态的&#xff0c;这有个动态排序&#xff0c;并且当我们需要让相应的访问次数加1的时候&#xff0c;我们用红黑树查找的时…

VS2022 嘿嘿

还是大二的时候就开始用这个&#xff0c;但居然是为了用PB&#xff0c;-_-|| 用了段时间换成了C#&#xff0c;依稀还记得大佬们纠正我的读法&#xff0c;别读C井&#xff0c;应该读C夏普。。。 安装过程其实也没啥&#xff0c;就是关键Key得花时间找&#xff0c;我好不容易搞…

【论文阅读】互连网络的负载平衡路由算法 (GAL, Globally Adaptive Load-balancing 全局自适应负载平衡)

Globally Adaptive Load-balancing 全局自适应负载平衡 GAL: Globally Adaptive Load-balanced routing 全局自适应负载平衡路由 1. GAL on a ring2. GAL on higher dimensional torus3. 实验性能4. 算法稳定性 Stability总结 References Globally Adaptive Load-balancing 全…

探索数学的奇妙世界:Mathematica之美【上】

文章目录 一、二维函数作图1.二维函数作图命令Plot2.曲线样式3.重画和组合图形4.二维函数绘图 二、三维函数作图1.函数作图命令Plot3D2.三维参数作图 三、等值线图和密度图1.等值线图2.密度图3.图形之间的转换 四、数据绘图1.二维数据绘图2.三维数据绘图 总结 一、二维函数作图…

限流--4种经典限流算法讲解--单机限流和分布式限流的实现

为什么需要限流 系统的维护使用是需要成本的&#xff0c;用户可能使用科技疯狂刷量&#xff0c;消耗系统资源&#xff0c;出现额外的经济开销问题&#xff1a; 控制成本>限制用户的调用次数用户在短时间内疯狂使用&#xff0c;导致服务器资源被占满&#xff0c;其他用户无…

深度学习-线性回归+基础优化算法

目录 线性模型衡量预估质量训练数据参数学习训练损失最小化损失来学习参数显式解 总结基础优化梯度下降选择学习率 小批量随机梯度下降选择批量大小 总结线性回归的从零开始实现实现一个函数读取小批量效果展示这里可视化看一下 线性回归从零开始实现线性回归的简洁实现效果展示…

selenium在Pycharm中结合python的基本使用、交互、无界面访问

下载 下载与浏览器匹配的浏览器驱动文件&#xff0c;这里一定注意的是&#xff0c;要选择和浏览器版本号相同的驱动程序&#xff0c;否则后面会有很多问题。 &#xff08;1&#xff09;浏览器&#xff08;以google为例&#xff09;版本号的查询&#xff1a; 我这里的版本号是1…

大规模数据处理和分析

大规模数据处理和分析&#xff1a;随着大数据技术的发展&#xff0c;处理大规模数据集的能力成为了一种竞争优势。热门问题包括数据清洗、特征工程、分布式计算等。 当我们谈到大规模数据处理和分析时&#xff0c;通常涉及到以下几个方面的内容&#xff1a; 数据清洗&#xff1…