题意是要求素数回文。注意到,偶数长的回文除了11都能被11整除所以不是素数,从而只需计算偶数长度的回文。程序写的不漂亮,之所以把fout放在参数里是很奇怪的原因:一开始在极限测试下WA,但我拿了标准输出数据和别的通过的程序的数据和我的输出比较没有任何差别。实在想不明白是怎么回事。
原题链接:
[url]http://ace.delos.com/usacoprob2?a=MGQn0aGbKxo&S=pprime[/url]
原题链接:
[url]http://ace.delos.com/usacoprob2?a=MGQn0aGbKxo&S=pprime[/url]
/*
ID: blackco3
TASK: pprime
LANG: C++
*/
#include <fstream>
#include <math.h>
using namespace std;
int prod[7]={1,10,100,1000,10000,100000,1000000};
int num[8], low, up ;
int prime_palin(ofstream &fout, int rank, int rank_max)
{
if( rank==rank_max ){
for( int i=0; i<rank-1; i++)
num[((rank-1)<<1)-i]=num[i] ;
int sum=0;
for( int i=0; i<=((rank-1)<<1); i++ )
sum += num[i]*prod[i] ;
if( sum>up )
return 0 ;
if( sum>=low ) {
int b_prime=true;
for( int i=2; i<=sqrt((float)sum); i++){
if( !(sum%i) ){
b_prime=false ;
break ;
}
}
if( b_prime )
fout << sum << endl ;
}
return 1 ;
}
for( int i=0; i<10; i++){
if( ( !i || i==2 ) && !rank )
continue ;
num[rank]=i;
if( !prime_palin(fout, rank+1, rank_max) )
return 0 ;
}
return 1 ;
}
int get_rank( int a ){
int r=0;
while(a)
a/=10, r++ ;
return r ;
}
int main()
{
ifstream fin("pprime.in");
fin >> low >> up;
ofstream fout("pprime.out");
int rank_up = ((get_rank(up)-1)>>1)+1 ;
if( low==5 )
fout << 5 << endl ;
if( low<=7 && up>=7 )
fout << 7 << endl ;
if( low<=11 && up>=11 )
fout << 11 << endl ;
if( rank_up >=2 ) {
for( int rank_max=2 ; rank_max<=rank_up ; rank_max++ )
prime_palin(fout, 0, rank_max);
}
return 0;
}