USACO Section1.5 Prime Palindromes 解题报告

    pprime解题报告 —— icedream61 博客园(转载请注明出处)
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
  求a到b之间的所有回文素数(即又是素数又是回文数的数)。
【数据范围】
  5<=a,b<=100,000,000
【输入样例】
  5 500
【输出样例】
  5
  7
  11
  101
  131
  151
  181
  191
  313
  353
  373
  383
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
  筛法求素数+回文数判断。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
  第一个点就卡住了,运行时错误。
  题目开始出现大数据了,以后要在交之前测试一下边界情况。
  本机测试没问题,经过多次OJ上测试,得出是定义数组的大小问题。数据给出b的最大值的是100,000,000,但若我bool数组建这么大,会爆运行时错误。
  我的解决办法是,实测满足条件的最大数maxd=9,989,899,于是数组范围定义为d[0~maxd],AC了……
  本题问题在于,我对USACO不甚了解。我查了USACO的内存限制,程序所用内存不能超过16M。
  maxd=9,989,899时,所占内存约为10/8=1.25M,肯定没问题。
  maxd=100,000,000时,所占内存约为100/8=12.5M,应该不超内存的;而USACO上面显示,我的代码运行0.000s时,使用了312KB的内存,这个看来自然是不可信……不知道为什么会超内存,好奇怪,这是为什么?在此向大家请教,希望知道的同学不吝赐教,多谢!

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

 1 /*

 2 ID: icedrea1

 3 PROB: pprime

 4 LANG: C++

 5 */

 6 

 7 #include <iostream>

 8 #include <fstream>

 9 using namespace std;

10 

11 const int maxd = 9989899;

12 //const int maxd = 100000000;

13 

14 int a,b;

15 bool d[1+maxd];

16 

17 int bit[9],l;

18 bool isPal(int x)

19 {

20     l=0;

21     while(x) { bit[++l]=x%10; x/=10; }

22     for(int i=1;i<=(l>>1);++i)

23         if(bit[i]!=bit[l+1-i]) return false;

24     return true;

25 }

26 

27 int main()

28 {

29     ifstream in("pprime.in");

30     ofstream out("pprime.out");

31 

32     d[0]=d[1]=true;

33     for(int i=2;i<=10000;++i)

34         if(!d[i])

35             for(int j=i+i;j<=maxd;j+=i) d[j]=true;

36 

37     in>>a>>b;

38 

39     for(int i=a;i<=b;++i)

40         if(i<=maxd && !d[i] && isPal(i)) out<<i<<endl;

41 

42     in.close();

43     out.close();

44     return 0;

45 }

 

你可能感兴趣的:(USACO)