巧排数字,将1,2,...,19,20这20个数字排成一排,使得相邻的两个数字之和为一个素数

22 篇文章 0 订阅
21 篇文章 0 订阅

巧排数字,将1,2,...,19,20这20个数字排成一排,使得相邻的两个数字之和为一个素数,且首尾两数字之和也为一个素数。编程打印出所有的排法。

排序方法:以贪心算法进行搜索,由于两个数字之和是一个素数,且首尾两数字之和也为一个素数,因此只需要找出以1开头的排列就可以了。使用贪心算法的同时使用回溯法,当遇到相邻两个数的时候就回溯到上一步从新搜索。

ofstream fout("D://Prime.txt",ios::app);
bool ISPrime(int n)
{
	for(int i=2;i<=sqrt((double)n);i++)
		if(n%i==0)
			return false;
	return true;
}
void PrimeArrange(int *arr,int begin,int length)
{
	
	if(begin==length)
	{
		if(ISPrime(arr[begin-1]+arr[0]))
		{
			copy(arr,arr+length,ostream_iterator<int,char>(fout,"  "));
			fout<<"\n";
			cout<<endl;
		}
		return;
	}
	else if(begin>1&&!ISPrime(arr[begin-1]+arr[begin-2]))//截枝和回溯
	{
		return;
	}
	else
	{
		for(int i=begin;i<length;i++)
		{
			swap(arr[begin],arr[i]);
			PrimeArrange(arr,begin+1,length);//搜索
			swap(arr[begin],arr[i]);
		}
	}
}
void PrimeArrange(int *arr,int length)
{
	if(arr==NULL||length<=0)
	{
		return;
	}
	PrimeArrange(arr,1,length);
}



int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
	
	PrimeArrange(a,20);
	fout.close();
        cout<<"结束"<<endl;
       return 0;
}

部分结果如下(结果集太大)



  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值