完全素数

来源:互联网 发布:linux mysql命令 编辑:程序博客网 时间:2024/06/06 03:14

Description

设一个m位素数p由高到低每一位分别是a1, a2, ..., am. 定义一个素数是完全素数当且仅当对于任意k(1<=k<=m)都有由a1到ak组成的数(a1a2...ak)均为素数。如,2333就是一个完全素数,因为2, 23, 233, 2333都是完全素数。

现在给定整数m(1<=m<=8),试求出所有m位的完全素数。

Input

  输入包含1个整数m(1<=m<=8)

Output

输出若干行,每一行包含一个m位的完全素数,由小到大输出。 

Sample Input
 Copy sample input to clipboard
3
Sample Output
233239293311313317373379593599719733739797

这道题用暴力解法会超时。这里可以用到递归跟深度优先搜索(DFS)----其实这两个都不是很懂。。。姑且让我装个B。。

下面是代码:

#include<bits/stdc++.h>using namespace std;int w;//w代表你输入的位数bool is(int n)//bool用来判断n是否为质数。如果是返回1,如果不是返回0. get到一个判断质数新方法。{if(n==1) return 0;for(int i=2;i*i<=n;i++)//注意这里是i*i<=n,如果是i*i<n,就不成立了。{if(n%i==0) return 0;}return 1;}void dfs(int num,int cnt)//这里是用递归思想。cnt表示实际的位数{if(!is(num)) return;if(cnt==w)//如果cnt等于输入的位数,则输出判断过后的质数。{cout<<num<<endl;return;}if(cnt<w)//如果cnt小于输入的位数,则,再次调用dfs函数,例如将1变成1*10+1=11,接着变成12.13等。                 {                                                                //同时位数+1。for(int i=1;i<10;i++){dfs(num*10+i, cnt+1);}}}int main(){while(cin>>w){for(int i=2;i<10;i++){dfs(i,1);               //调用dfs函数,判断是否为质数。}} return 0;}


利用这种方法,可以减少判断的次数。比如,一位数满足的条件的是2,3,5,7。二位数只需要判断20+,30+,50+,70+。

0 0