洛谷-回文质数-过程函数与递归

题目描述 Description

因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数。 
写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数;

输入输出格式 Input/output

输入格式:
第 1 行: 二个整数 a 和 b .
输出格式:
输出一个回文质数的列表,一行一个。

输入输出样例 Sample input/output

样例测试点#1

输入样例:

5 500

输出样例:

5
7
11
101
131
151
181
191
313
353
373
383

说明 description

Hint 1: Generate the palindromes and see if they are prime. 
提示 1: 找出所有的回文数再判断它们是不是质数(素数).

Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below. 
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。

题目翻译来自NOCOW。
USACO Training Section 1.5

产生长度为5的回文数:

1 for (d1 = 1; d1 <= 9; d1+=2) {    // 只有奇数才会是素数
2      for (d2 = 0; d2 <= 9; d2++) {
3          for (d3 = 0; d3 <= 9; d3++) {
4            palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
5          }
6      }
7 }

思路:这题难度是有点大,范围竟然有一亿,太坑爹了!所以我对它做了些简化:

①从奇数开始找,每次i=i+2;

②没有偶数位的回文质数,省了一大把时间,真是造福人类啊!

③排除2、5的倍数

每个函数实现过程详解:

①判断回文数:存入一个数组,判断从前往后扫和从后往前扫是否一致。

②判断位数(检测长度是否大于一亿):从前往后扫,返回循环次数就得了。

③判断质数(这个很重要哦):i从3开始,每次i=i+2,再用那个数去试除i,如果刚好除尽,那么就是质数了,返回1。

代码如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 int huiwen(int k);//判断回文数
 4 int hwlength(int k);//计算回文数的长度
 5 int prime(int k);//判断质数
 6 int main()
 7 {
 8     int a,b,i,j;
 9     scanf("%d%d",&a,&b);
10     for (i=a;i<=b;i++)
11     {
12         if(i%2==0&&i!=2)//排除2的倍数
13             continue;
14         if(i%5==0&&i!=5)//排除5的倍数
15             continue;
16         if(hwlength(i)%2==0&&i!=11)//回文数的长度为偶且不为11
17             continue;
18         if(huiwen(i)!=1)//不是回文直接跳过
19             continue;
20         if(prime(i))//是质数
21             printf("%d\n",i);
22     }
23     return 0;
24 }
25 int huiwen(int k)
26 {
27     int a[10],i=0,j;
28     while(k>0)//每一位存入数组,再判断
29     {
30         a[i]=k%10;
31         k=k/10;
32         i++;
33     }
34     for (j=0;j<i;j++)//两重循环判断(前后后前扫法)
35         if(a[j]!=a[i-j-1])//不是,返回0
36             return 0;
37     return 1;//结束后,是,返回1
38 }
39 int hwlength(int k)
40 {
41     int a[10],i=0;
42     while(k>0)
43     {
44         a[i]=k%10;
45         k/=10;
46         i++;
47     }
48     return (i);//循环了i次
49 }
50 int prime(int k)
51 {
52     int i;
53     for(i=3;i*i<=k;i=i+2)//这样可以减少好多次循环
54         if(k%i==0)
55         {
56             return 0;
57         }
58     return 1;
59 }
时间: 2024-12-27 15:53:22

洛谷-回文质数-过程函数与递归的相关文章

洛谷-数的计算-过程函数与递归

题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1.不作任何处理; 2.在它的左边加上一个自然数,但该自然数不能超过原数的一半; 3.加上数后,继续按此规则进行处理,直到不能再加自然数为止. 输入输出格式 Input/output 输入格式:一个自然数n(n<=1000)输出格式:一个整数,表示具有该性质数的个数. 输入输出样例 Sample input/output 样例测

P1217【洛谷FromUSACO】[USACO1.5]回文质数 Prime Palindromes

直接上题——[传送门:http://www.luogu.org/problem/show?pid=1217] 题目来源USACO,NOCOW翻译,洛谷转载,懂(F_Q)的童鞋们可以去USACO官网逛逛……<!———————————下面是原题—————————————————————————————--> P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数.写一个程

洛谷P1217回文质数-Prime Palindrome回溯

P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include <cstdio> #include <iostream> #include <cmath> const int maxn = 100; using namespace std; int a[maxn],l,r; bool is_prime(int n) //判断素数 { int

洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes

P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 复制 5 500 输出样例#1: 复制 5 7

洛谷 P1217 [USACO1.5]回文质数 Prime Palindromes【取回文数/数论/字符串】

题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 复制 5 500 输出样例#1: 复制 5 7 11 101 131 151 181 191 313 353 373 383

回文质数 USACO

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数.写一个程序来找出范围[a,b](5<=a<b<=100,000,000)间的所有回文质数; 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数.写一个程序来找出范围[a,b](5<=a<b<=100,000,0

luogu P1217 [USACO1.5]回文质数 Prime Palindromes x

P1217 [USACO1.5]回文质数 Prime Palindromes 题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 5 500 输出样例#1: 5 7 11 101

【USACO 1.5.1】回文质数

[题目描述] 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围[a,b](5 <= a < b <= 100,000,000)( 一亿)间的所有回文质数; [格式] INPUT FORMAT: (file pprime.in) 第 1 行: 二个整数 a 和 b . OUTPUT FORMAT: (file pprime.out) 输出一个回文质数的列表,一行一个. [分析] 晕,交了3遍才过.(不要鄙视我了==) 先

P1217 [USACO1.5]回文质数 Prime Palindromes

题目描述 因为151既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 是回文质数. 写一个程序来找出范围a,b( 一亿)间的所有回文质数; 输入输出格式 输入格式: 第 1 行: 二个整数 a 和 b . 输出格式: 输出一个回文质数的列表,一行一个. 输入输出样例 输入样例#1: 5 500 输出样例#1: 5 7 11 101 131 151 181 191 313 353 373 383 说明 Hint 1: Generate the palindromes and