又是素数的问题,“超级”素数指的是型如这样的整数:7331,其中前缀7,73,733,以及自身7331都是素数。给定一个n,找到所有n位的“超级”素数。n的范围是1-8。8位数是千万级,穷举是不现实的。根据superprime的性质,很容易想到自己构造这样的数字。首先观察一下每个位上的数字。对于一个n位数,除了首位,其他位置上都不会出现偶数和数字5,否则就不是素数了。首位上,2显然是可以出现的,但是奇数9却不可以。那么,首位上的数字是:『2,3,5,7』,其余各位可以出现的数字是:『1,3,7,9』。ok,这样以来需要测试的数字就很少了。Superprime少的可怜,8位上只剩下5个,9位上已经一个没有。真算得上是稀有品种了。
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
int isprime(int i){
if(i == 2) return 1;
if(!(i % 2)) return 0;
for(int divisor = 3; divisor * divisor <= i; divisor += 2){
if(!(i % divisor)) return 0;
}
return 1;
}
int main(){
int n, sentinel = 1;
ifstream fin("sprime.in");
fin>>n;
while(n > 1){
sentinel *= 10;
--n;
}
int other[] = {1, 3, 7, 9};
queue<int> sprime;
sprime.push(2);
sprime.push(3);
sprime.push(5);
sprime.push(7);
while(sprime.front() < sentinel && !sprime.empty()){
int candidate = sprime.front();
sprime.pop();
for(int i = 0; i < 4; ++i){
int cand = candidate * 10 + other[i];
if(isprime(cand)) sprime.push(cand);
}// for end
}// while end
ofstream fout("sprime.out");
while(!sprime.empty()){
fout<<sprime.front()<<endl;
sprime.pop();
}
}