zoukankan      html  css  js  c++  java
  • 巧排数字,将1,2,...,19,20这20个数字排成一排,使得相邻的两个数字之和为一个素数

    巧排数字,将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<<"
    ";
    			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;
    }

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



  • 相关阅读:
    某耳机厂商微信公众平台建设方案
    微信公众号订单好评红包返现系统
    LNMP的配置与优化
    微信公众号用户OpenID同步导出系统
    微信公众号无限定时群发系统
    小程序想要什么
    微信支付默认推荐关注规则
    微信小程序(应用号)资源汇总整理
    微信公众平台小程序开发教程
    微信应用号开发教程
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3324988.html
Copyright © 2011-2022 走看看