素数环2[优化]

素数环2

题目描述

将1~n这n个数字首尾相连,形成一个圆环,要求圆环上任意两个相邻的数字之和都是一个素数,请编程输出符合条件的素数环。

输入

输入数据仅一行,包含一个正整数n(n<=20)。

输出

输出数据最多包括10行,每行由n个整数组成,表示前十个符合条件的素数环(不足十个时全部输出)。所有素数环第一个元素必须是1,且按照从小到大的顺序排列。

输入复制

6

输出复制

1 4 3 2 5 6
1 6 5 2 3 4

AC代码

#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int n, cur, q[N], st[N], isp[N];
void print()
{
	++ cur;
	for (int i = 1; i <= n; ++ i)
		cout << q[i] << ' ';
	cout << endl;
}

bool check(int k)
{
	for (int i = 2; i <= sqrt(k); ++ i)
		if (k % i == 0) return false;
	return true;
}

void dfs(int k)
{
	int i;
	if (cur >= 10) return;
	if (k <= n) {
		if (k & 1) i = 3;
		else i = 2;
		for (; i <= n; i += 2) {
			if (!st[i]) {
				st[i] = 1;
				q[k] = i;
				if (isp[q[k - 1] + q[k]])dfs(k + 1);
				st[i] = 0;
			}
		}
	} else if (isp[1 + q[k - 1]]) print();
}

int main()
{
	cin >> n;
	if (n & 1) return 0;
	for (int i = 2; i <= 2 * n; ++ i) isp[i] = check(i);
	q[1] = 1;
	dfs(2);
	return 0;
}

题解

采用递归回溯的方法,进行每次存储,需要注意的是,连接成一个环,一定不要忘了第一个元素和最后一个元素也要满足和为素数

优化点

  1. 如果n为奇数,那么肯定不能形成一个素数环。
  2. 满足素数环的条件,必须相邻的两个数既不能都是奇数,也不能都是偶数,由题目知,奇数放奇数,偶数放偶数,在递归中采用步长为2,就是依据此原理
  3. 筛素数,在判断前,对数据提前存储素数,有利于快速判断素数,是以空间换时间的思想
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\],素数是指将从1到n这n个整数围成一个圆环,其中任意个相邻的数字相加的结果都是素数。对于问题中的1439,我们需要找到一个由1到1439组成的素数。 根据引用\[2\]的方法,我们可以使用递归回溯的方法来解决这个问题。首先,我们需要判断1439是否为奇数,如果是奇数,则无法形成素数。然后,我们可以按照奇偶性将数字分为组,奇数放在奇数位置,偶数放在偶数位置。在递归过程中,我们可以使用步长为2来筛选素数,这样可以快速判断数字之和是否为素数。 最后,我们可以按照字典序对解进行排序,并输出指定编号的解。对于问题中的1439,我们需要输出第2组解。 请注意,由于题目要求一个素数只算一次,所以可能存在多个解。最后一行输出的是总的方案数。 希望这个回答对你有帮助! #### 引用[.reference_title] - *1* [素数问题](https://blog.csdn.net/nomad2/article/details/7830448)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [素数2[优化]](https://blog.csdn.net/qq_56853041/article/details/123700955)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [c++算法之回溯 素数(二)](https://blog.csdn.net/CQBZLYTina/article/details/72844258)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值