华东师范考研机试:镜中的质数

因为要准备复试机试就每天刷两道题

C - 镜中的质数 EOlymp - 22

prb22
一个质数,若将其各位从右向左读仍是质数,我们则称之为“镜质数”.

请你求出区间[a, b]当中所有“镜质数”的个数.

数据输入
在一行中给出两个整数 a 和 b (1 ≤ a ≤ b ≤ 10000),中间用一个空格分隔.

Output
输出一个整数,是区间[a,b]当中“镜质数”的个数.

Example 1
Input example #1

10 25

Output example #1

3

我的代码

#include<iostream>
#include<cstdio>
#include<cstring> 
#include<string>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
int prime[10000],pNum=0;
bool p[10000]={0};
void Find_Prime()
{
	for(int i=2;i<10000;i++)
	{
		if(p[i]==false)
		{
			prime[pNum++]=i;
			for(int j=i+i;j<10000;j+=i)
			{
				p[j]=true;
			}	
    	}
	}
} 
int main()
{
   int a,b;
   cin>>a;
   cin>>b;
   Find_Prime();
   p[1]=1;
   int sum=0;
   for(int i=a;i<=b;i++)
   {
	   	if(p[i]==false)
		{
			string s=to_string(i);
		   	reverse(s.begin(),s.end()); 
			int x=stoi(s,0,10);
			   if(p[x]==false)
			   {
			   sum++;
		       }
		}
   }
   cout<<sum<<endl;
}

参考答案

#include <cstdio>
#include <cstring>

#define MAXN 10007

char isPrime[MAXN];
void init()
{
    memset(isPrime,1,sizeof(isPrime));
    isPrime[0]=0;
    isPrime[1]=0;
    int i,j;
    for(i=2;i*i<=MAXN;i++)
    {
        if(isPrime[i]==0)
            continue;
        for(j=i*i;j<MAXN;j+=i)
            isPrime[j]=0;
    }
    return ; 
}

int mirror(int x)
{
    int r=0;
    while (x>0)
    {
        r=r*10+x%10;
        x/=10;
    }
    return r;
}

int main(void)
{
    init();
    int i,lwbd,upbd,r;
    scanf("%d%d",&lwbd,&upbd);
    int counter=0;
    for(i=lwbd;i<=upbd;i++)
    {
        r=mirror(i);
        if(isPrime[i] && isPrime[r])
            counter+=1;
    }
    printf("%d\n",counter);
    return 0;
}

反思

用了素数筛的方法,这道题没有卡时间,用常规方法也能做
每次考虑素数的时候都得想一下1不是素数,一不小心就忘了。
另外to_string和stoi是真的好用,省去写函数的麻烦。

目录 第一章 从零开始 8 1.1机试分析 8 1.2 IDE的选择与评测结果 10 1.3 DreamJudge的使用 11 1.4输入输出技巧 12 1.5头文件技巧 15 1.6数组使用技巧 16 1.7审时度势 — 复杂度与是否可做 19 1.8 C++ STL的使用 21 1.9多组输入的问题 27 第二章 入门经典 29 2.1 简单模拟 30 2.2 进制转换类问题 32 2.3 排版类问题 37 2.4 日期类问题 42 2.5 字符串类问题 45 2.6 排序类问题 47 2.7 查找类问题 54 2.8 贪心类问题 61 2.9 链表类问题 65 第三章 数学 68 3.1 同模余定理 69 3.2 最大公约数(GCD) 72 3.3 最小公倍数(LCM) 74 3.4 斐波那契数列 75 3.5 素数判定 76 3.6 素数筛选 78 3.7 分解素因数 81 3.8 二分快速幂 83 3.9 常见数学公式总结 85 3.10 规律神器OEIS 87 第四章 高精度问题 89 4.1 Python解法 90 4.2 Java解法 91 4.3 C/C++解法 92 第五章 数据结构 93 5.1 栈的应用 94 5.2 哈夫曼树 96 5.3 二叉树 102 5.4 二叉排序树 111 5.5 hash算法 114 5.6 前缀树 115 第六章 搜索 121 6.1 暴力枚举 122 6.2 广度优先搜索(BFS) 124 6.3 递归及其应用 127 6.4 深度优先搜索(DFS) 130 6.5 搜索剪枝技巧 135 6.6 终极骗分技巧 138 第七章 图论 139 7.1 理论基础 140 7.2 图的存储 145 7.3 并查集 148 7.4 最小生成树问题 151 7.5 最短路径问题 155 7.6 拓扑排序 162 第八章 动态规划 165 8.1 递推求解 166 8.2 最大子段和 168 8.3 最长上升子序列(LIS) 170 8.4 最长公共子序列(LCS) 174 8.5 背包类问题 176 8.6 记忆化搜索 179 8.7 字符串相关的动态规划 182
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值