回溯法(简单例子)素数环问题

该程序使用C++编写,目的是在给定的整数n范围内填充一个特殊的素数圈。数组a[n]中的每个元素代表一个位置,初始为0。程序通过循环和递归检查每个位置k,填充满足条件的素数,条件是相邻两个位置的数字之和也是素数。当整个圈填充完毕,程序输出解并结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.代码

#include<iostream>
#include<windows.h>
using namespace std;
#include <math.h>

const int n = 20;
int a[n];
void PrimeCircle(int n);
int Check(int k);
int Prime(int x);

int main( )
{
	int n;
	cout<<"请输入一个整数;";
	cin>>n;
	PrimeCircle(n);
	Sleep(80000);
	return 0;
}

void PrimeCircle(int n)
{ 
	int i, k;
	for (i = 0; i < n; i++ )               //将数组a[n]初始化为0
		a[i] = 0;
	a[0] = 1; k = 1;           //指定第1个位置填写1,注意数组下标从0开始
	while (k >=1)
	{
		a[k] = a[k]+1;
		while (a[k] <= n)
			if (Check(k) == 1) break;         //位置k可以填写整数a[k]
			else a[k] = a[k] + 1;              //试探下一个数
		if (a[k] <= n && k == n - 1) {        //求解完毕,输出解
			for (i = 0; i < n; i++) 
				cout<<a[i]<<"  ";
			return; 
		}
		if (a[k] <= n && k < n - 1) 
			k = k + 1;               //处理下一个位置
		else {
			a[k] = 0; k = k - 1;        //回溯
		}
	}
}
int Check(int k)                    //判断位置k的填写是否满足约束条件
{
	int flag = 0;
	for (int i = 0; i < k; i++)           //判断是否重复
		if (a[i] == a[k]) return 0;
    flag = Prime(a[k] + a[k - 1]);
    if (flag == 1 && k == n - 1) flag = Prime(a[k] + a[0]);
	return flag;
}
int Prime(int x)                   //判断是否素数
{
	int i, n;
	n = (int)sqrt((double)x);
	for (i = 2; i <= n; i++)
		if (x % i == 0) return 0;
	return 1;
}

2.结果示例
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值