尋找指定的特殊素數
阿新 • • 發佈:2018-12-26
題目描述
有一種特殊素數,它本身是一個素數,從右邊開始逐位去掉,剩下的數也總是素數。例如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]); }