USACO Training Section1.5 Superprime Rib

简单不过的程序,超级素数的计算。注意最高位可选的数与其他位有所不同,其他位的数字可排除偶数,减少运算量。一次编译,一次AC。

顺便查了下作素数测试的Miller Rabin算法,随机算法学过很久很久了,这算是经典的一个。

原题链接:
http://ace.delos.com/usacoprob2?a=bFftpewR5eD&S=sprime

/*
ID: blackco3
TASK: sprime
LANG: C++
*/
#include <fstream>
#include <math.h>
using namespace std;

int prime[]={2,3,5,7}, n_prime=4 ;
int org[]={1,3,5,7,9}, n_org=5 ;
int n_digit ;
ofstream fout("sprime.out");

inline int is_prime(int num) {
	for( int i=2; i*i<=num; i++)
		if( !(num%i) )
			return 0;
	return 1;
}

void get_sprime(int rank, int cur)
{
	if( rank==n_digit ){
		fout << cur << endl ;
		return ;
	}
	for( int i=0; i<n_org; i++ ){
		int next = cur*10+org[i] ;
		if( is_prime(next) )
			get_sprime(rank+1,next);
	}
}

int main()
{	
	ifstream fin("sprime.in");
	fin >> n_digit ;
	int cur_sum ;
	for( int i=0; i<n_prime; i++){
		cur_sum=prime[i] ;
		get_sprime(1,cur_sum);	
	}

	return 0;
}

你可能感兴趣的:(C++,c,算法,C#)