1. 程式人生 > >尋找指定的特殊素數

尋找指定的特殊素數

題目描述
有一種特殊素數,它本身是一個素數,從右邊開始逐位去掉,剩下的數也總是素數。例如7331,是一個素數,去掉尾部的1,剩下數字733,也是一個素數;再去掉尾部的3,剩下73,還是一個素數,繼續去掉尾部的3,剩下7,仍然是一個素數,我們就把7331叫做長度為4的特殊素數。如果長度為n的特殊素數有若干個,我們將它們從小到大排列,最小的我們稱它的位置為1,次小的位置為2,第三小的位置為3,以此類推,編寫程式尋找長度為n,指定位置為m的特殊素數,如果n位特殊素數共有k個,但m>k,我們就說指定位置m上沒有特殊素數,則輸出“Error!”(不包括引號)。注:數字1不被看作一個素數。

輸入
只有一行:包含兩個正整數n和m,兩數間用一個空格分隔。(1<=n<=8,1<=m<=100)

輸出
僅一行:如果指定長度和位置的素數存在就輸出這個素數,否則輸出“Error!”(不包括引號)。

樣例輸入
4 6
樣例輸出
3119

提示
長度為 4 的特殊素數從小到大依次為 2333 2339 2393 2399 2939 3119 3137…,可以看出位置為 6 的素數為 3119。

每位數字 的開關是2、3、5、7 其餘各位是1 3 7 9 中的一個

#include <bits/stdc++.h>
#include <stdio.h>
using namespace std;
int n;
int b[105],k=0;
int a[4]={1,3,7,9}; 
int sushu(int ans)      //判斷是否為素數
{
	**for(int i=2;i*i<=ans;i++){    //一種新的判斷是否為素數
		if(ans%i==0) return 0;
	}**
	return 1;
}
int dfs(int ans,int m)
{
	if(m==n){
		b[k++]=ans;
		return 0;
	}
	for(int i=0;i<4;i++){
		ans=ans*10+a[i];
		if(sushu(ans)){
			dfs(ans,m+1);
		}
		ans=ans/10;
	}
}
int main()
{
	int m;
	cin>>n>>m;
	dfs(2,1);      //每位數字 的開關是2、3、5、7        其餘各位是1 3 7 9 中的一個
	dfs(3,1);
	dfs(5,1);
	dfs(7,1);
	if(m>k) printf("Error!\n");
	else printf("%d\n",b[m-1]);
}