USACO1.5.2--Prime Palindromes
2013-01-31 10:25
337 查看
Prime Palindromes
The number 151 is a prime palindrome because it is both a prime number and a palindrome (it is the same number when read forward as backward). Write a program that finds all prime palindromes in the range of two supplied numbers a and b (5 <= a < b <= 100,000,000); both a and b are considered to be within the range .PROGRAM NAME: pprime
INPUT FORMAT
Line 1: | Two integers, a and b |
SAMPLE INPUT (file pprime.in)
5 500
OUTPUT FORMAT
The list of palindromic primes in numerical order, one per line.SAMPLE OUTPUT (file pprime.out)
5 7 11 101 131 151 181 191 313 353 373 383
HINTS (use them carefully!)
Prime Palindromes: Hint 1
Generate the palindromes and see if they are prime.Prime Palindromes: Hint 2
Generate palindromes by combining digits properly. You might need more than one of the loops like below./* generate five digit palindrome: */ for (d1 = 1; d1 <= 9; d1+=2) { /* only odd; evens aren't so prime */ for (d2 = 0; d2 <= 9; d2++) { for (d3 = 0; d3 <= 9; d3++) { palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1; ... deal with palindrome ... } } } 题解:枚举。可以先生成回文数然后再判断是否是质数。我第一次是用最朴素的方法,一亿果断超时了。生成回文数的时候有个小技巧,也就是Hint 2提到的,因为回文数是对称的,所以我么只要枚举回文数的一半就行,然后再倒转一下就OK了。并且偶数长度的回文数全部能整除11,所以我么只需枚举奇数长度的回文数就可以了,唯一特殊的偶数长度的回文数就是11。这样的话最大的数据枚举量也就是5*9*9*9=3645。比直接枚举一亿,少了好多!!!
View Code
/* ID:spcjv51 PROG:pprime LANG:C */ #include<stdio.h> #include<math.h> long f[15]; long a,b; int is_prime(long n) { long i; if(n<2) return 0; for(i=2; i<=sqrt(n); i++) if(n%i==0) return 0; return 1; } int main(void) { freopen("pprime.in","r",stdin); freopen("pprime.out","w",stdout); long i,d1,d2,d3,d4,palindrome; scanf("%ld%ld",&a,&b); for(i=a; i<10; i++) if(is_prime(i)) printf("%ld\n",i); if(a<11&&b>11) printf("%d\n",11); for (d1 = 1; d1 <= 9; d1+=2) for (d2 = 0; d2 <= 9; d2++) { palindrome = 100*d1 + 10*d2 + d1; if(palindrome>=a&&palindrome<=b&&is_prime(palindrome)) printf("%ld\n",palindrome); } for (d1 = 1; d1 <= 9; d1+=2) for (d2 = 0; d2 <= 9; d2++) for(d3=0; d3<=9; d3++) { palindrome =10000*d1+1000*d2+100*d3 + 10*d2 + d1; if(palindrome>=a&&palindrome<=b&&is_prime(palindrome)) printf("%ld\n",palindrome); } for (d1 = 1; d1 <= 9; d1+=2) for (d2 = 0; d2 <= 9; d2++) for(d3=0; d3<=9; d3++) for(d4=0; d4<=9; d4++) { palindrome =1000000*d1+100000*d2+10000*d3+1000*d4+100*d3 + 10*d2 + d1; if(palindrome>=a&&palindrome<=b&&is_prime(palindrome)) printf("%ld\n",palindrome); } return 0; }
相关文章推荐
- USACO section 1.5.2 Prime Palindromes
- USACO section 1.5.2 Prime Palindromes
- USACO 1.5.2 prime palindromes
- USACO1.5.2 Prime Palindromes (pprime)
- [USACO 1.5.2] Prime Palindromes
- USACO1.5.2 Prime Palindromes (pprime)
- USACO: Section 1.5 -- PROB Prime Palindromes
- USACO-cha1-sec1.5 Prime Palindromes
- USACO-Section1.5 Prime Palindromes【暴力枚举】
- 洛谷P1217 [USACO1.5]回文质数 Prime Palindromes
- USACO1.5 回文质数 Prime Palindromes
- luogu P1217 [USACO1.5]回文质数 Prime Palindromes
- 数组去重 usaco Prime Palindromes
- USACO-Section1.5 Prime Palindromes
- USACO1.5]回文质数 Prime Palindromes
- USACO-Prime Palindromes(部分筛法判素数,回文数生成)
- USACOTrainning.Prime Palindromes
- 【枚举】洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes
- USACO Section 1.5 Prime Palindromes
- [USACO1.5]回文质数 Prime Palindromes