竟然第一次就通过了,难得啊~~~
思路是这样的: 对每一个SuperPrime,最高位在{2,3,5,7}里挑,其他位在{1,3,7,9}里挑。
所以在构造n位的SuperPrime数的时候,从高位(第一位)到低位(第N位),采用递归;并且分level == 1 , level > 1两种情况。 level == N + 1 的时候结束。见代码
/*
ID: wangxin12
PROG: sprime
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
#include <string>
using namespace std;
int N;
bool isPrime(int n) {
bool flag = true;
int start = 2;
int end = sqrt((double)n);
for(int i = start; i <= end; i++) {
int mod = n % i;
if( mod == 0) {
flag = false;
break;
}
}
return flag;
}
void f(int level, vector<int> & v1) {
//base case
if(level == N + 1) {
ofstream fout("sprime.out");
for(int i = 0; i < v1.size(); i++) {
fout<<v1[i]<<endl;
}
fout.close();
return;
}
vector<int> curr;
if(level == 1) {
curr.push_back(2);
curr.push_back(3);
curr.push_back(5);
curr.push_back(7);
f(level + 1, curr);
return;
}
for(int i = 0; i < v1.size(); i++) {
int temp;
temp = v1[i] * 10 + 1;
if(isPrime(temp)) curr.push_back(temp);
temp = v1[i] * 10 + 3;
if(isPrime(temp)) curr.push_back(temp);
temp = v1[i] * 10 + 7;
if(isPrime(temp)) curr.push_back(temp);
temp = v1[i] * 10 + 9;
if(isPrime(temp)) curr.push_back(temp);
}
f(level + 1, curr);
return;
}
int main() {
ifstream fin("sprime.in");
fin>>N;
fin.close();
vector<int> result;
f(1, result);
return 0;
}