您的位置:首页 > 编程语言 > C语言/C++

USACO SuperPrime Rib

2012-06-18 22:22 288 查看
竟然第一次就通过了,难得啊~~~

思路是这样的: 对每一个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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++