洛谷 P1218 特殊的质数肋骨

特殊的质数肋骨

  • 题目描述
  • 输入输出格式
    • 输入样例
    • 输出样例
  • 题目解析
  • 代码实现

题目描述

农民约翰的母牛总是产生最好的肋骨。你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说: 7 3 3 1 全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。 7331 被叫做长度 4 的特殊质数。写一个程序对给定的肋骨的数目 N (1<=N<=8),求出所有的特殊质数。数字1不被看作一个质数。

输入输出格式

输入样例

4

输出样例

2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393

题目解析

本题有两种解法,甚至更多,但是我只想了两个解法,一种是枚举,一种是搜索。

枚举
枚举就很好想了,设置一个循环,枚举每个数,判断是否为特殊的质数。但是由于1<=n<=8,当n为8时,可能会超时。不可取

搜索
搜索的思路也比较容易想到,从第一位开始,如果第一位满足素数的要求,就继续递归下一位。

例如,n为3,我们模拟一下。

先从1到9,找素数,2为素数,满足条件,递归

继续从1到9循环,如果2×10+i,为素数,则继续递归,当i为3时,当前结果为23,满足条件,继续递归

继续从1到9循环,如果23×10+i为素数,则找到一个特殊质数了。当i为3时,当前结果为233,满足条件。

对于搜索和枚举这两种解法我都写了,我们来看一下两者的运行时间,差别还是很大的。
搜索是耗时14ms,枚举是耗时622ms。
洛谷 P1218 特殊的质数肋骨_第1张图片

代码实现

#include
#include
using namespace std;
int n;

/*
判断是否为素数 
*/
bool isPrime(int x){
	if(x == 1)	return false;
	for(int i = 2; i <= sqrt(x); i ++){
		if(x % i == 0){
			return false;
		}
	}	
	return true;
}

void dfs(int step,int res){
	for(int i = 1; i <= 9; i ++){
		if(isPrime(res*10+i)){
			//如果位数为n,且res*10+i为 特殊质数,输出 
			if(step == n){
				int cnt = res*10+i;
				cout << cnt << endl;
			//如果位数不为n,即位小于n,递归下一位数 
			}else{
				dfs(step+1,res*10+i);
			}
		}
	}
}
int main(){
	cin >> n;
	dfs(1,0);
	return 0;
}

你可能感兴趣的:(洛谷,搜索)