您的位置:首页 > 其它

USACO 1.5 Prime Palindromes

2010-05-22 18:48 477 查看
1.生成回文数 (100000000以内)大概20000个

2.判断素数

生成回文数的算法思想:

分别生成数位是奇odd,和数位是偶even的回文数,

对于串1234, 翻转一下 4321,再接上就生成了一个回文数 ,odd:1234321 even:12344321

实现的方法可以多种多样。我用的是递归的方法。

代码

/*
ID: superbi1
LANG: C
TASK: pprime
*/
#include <stdio.h>
#include <math.h>
#include <string.h>
#define NL 20000

int plin[NL], npl;

void genPrim(int high, int low, int val)
{
int I;
if (high < low) {
plin[npl++] = val;
return;
}
if (low == 1) I = 1;
else I = 0;
for (; I<=9; I++) {
if (high == low) genPrim(high-1, low+1, val+(int)pow(10, high-1)*I);
else genPrim(high-1, low+1, val+(int)pow(10, high-1)*I + (int)pow(10, low-1)*I);
}
}

int isPrim(int P)
{
int M = (int)sqrt(P);
int I;
for (I=2; I<=M; I++) {
if (P%I == 0) return 0;
}
return 1;
}

int main()
{
FILE *fin = fopen("pprime.in", "r");
FILE *fout = fopen("pprime.out", "w");
int I;
int a, b;
npl = 0;
for (I=1; I<=8; I++) {
genPrim(I, 1, 0);
}
fscanf(fin, "%d%d", &a, &b);
I = 0;
while (I<npl) {
if (plin[I] >= a) break;
I++;
}
while (I<npl && plin[I]<=b) {
if (isPrim(plin[I])) {
fprintf(fout, "%d\n", plin[I]);
}
I++;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: