一只小蒟蒻备考蓝桥杯的日志
笔记
素数筛
欧拉筛Eluer
bool is_prime[MAXSIZE];
int prime[MAXSIZE];
void Euler(int MAXSIZE) {
memset(is_prime, true, sizeof(is_prime));
is_prime[0] = false;
is_prime[1] = false;
int cnt = 0;
for(int i = 2; i <= MAXSIZE; i++) {
if(is_prime[i]) {
prime[cnt++] = i;
}
for(int j = 0; j < cnt && i * prime[j] <= MAXSIZE; j++) {
is_prime[i * prime[j]] = false;
if(i % prime[j] == 0) break;
}
}
}
埃氏筛
void E(int MAXSIZE) {
memset(is_prime, true, sizeof(is_prime));
int cnt = 0;
for(int i = 2; i <= MAXSIZE; i++) {
if(is_prime[i]) {
prime[cnt++] = i;
for(int j = i * i; j <= MAXSIZE; j += i) {
is_prime[j] = false;
}
}
}
}
平方探测
bool Sqrt_isPrime(int x) {
if (x % 2 == 0) return false;
for(int i = 3; i * i <= x; i += 2) {
if(x % i == 0) return false;
}
return true;
}
前两者适合有很多很多数要筛,打表的时候
后者适合单个数(或少量数据)判断
快排 sort
#include <algorithm>
sort(begin, end, cmp);
//sort(arr, arr + t, cmp)
//cmp for example:
greater<int>() // 从大到小
less<int>() // 从小大到
bool cmp(int a, int b) {
return a > b;
}
回文数
要么一堆for组合,代码长,但是直接从小到大排好
要么下附的,嵌入式找回文数,但要sort排一下
哎哟喂我个鬼精灵的
void Find_Palindromes(int b1, int &t) {
P[t++] = 11; //偶数位回文质数只有11
for (int i = 1; i <= 9; i+= 2) {
P[t++] = i;
for (int j = 0; j <= 9 && b1 >= 3; j++) {
P[t++] = i * 100 + j * 10 + i;
for (int k = 0; k <= 9 && b1 >= 5; k++) {
P[t++] = i * 10000 + j * 1000 + k * 100 + j * 10 + i;
for (int p = 0; p <= 9 && b1 >= 7; p++) {
P[t++] = i * 1000000 + j * 100000 + k * 10000 + p *1000 + k * 100 + j * 10 + i;
}
}
}
}
sort(P, P + t, less<int>());
}
三维数组
参考 C语言之三维数组
char W[10][5][3]=//W[i][j][k]表示第i个数字的第j行的第k列,(手打累死了)
{
{//0
'X','X','X',
'X','.','X',
'X','.','X',
'X','.','X',
'X','X','X',
},
{//1
'.','.','X',
'.','.','X',
'.','.','X',
'.','.','X',
'.','.','X',
}, ...
//使用时
W[1][1][i] 搭配for循环一个个输出
刷题
- P1055 [NOIP2008 普及组] ISBN 号码
- P5723 【深基4.例13】质数口袋
- P1217 [USACO1.5] 回文质数 Prime Palindromes
- P2615 [NOIP2015 提高组] 神奇的幻方
心得
- 第1-2题都很简单…入门罢了
- 第3题(回文质数),小小总结一些
- 找回文的素数,考虑到回文数少,避免超时,要先打回文数,枚举
- 偶数位的回文数,除了11,都不是素数
- 这次呆呆地一个个独立的for组合从1位打到7位,发现之前是组合式打(上附)优点是代码短,缺点是要快排一下
- 第4题(幻方)纯纯无脑跟着题目走就行,只是容易脑抽
- 一会第一行,一会最后一行,难绷
- 强烈要求,不管题目看似多么简单模拟,先拿小数据样例模拟走一边(或者说,至少把告知的模拟点都走一遍,免得理解错误,辛辛苦苦白写)
- 建议这种,switch-case、else-if型,不用偷懒滥用else和default,把它们用作异常报错
- 如果还是很不幸出错了,从小数据样例出发,找到第一个出错的点,回溯找到上一个失误点
- 第5题没有真正写,总体思路,打表
- 三维数组瞅一眼吧(上附)
- 很巧妙的一种思路,比如说,已知要输出5行,每个数据是以5x5的大小打印的(人脑5x5块状打印,但电脑只能一行行打印),可以用string ans[5] 把每行的答案先记录下来(形如 ans[i] += “12345”)统一输出
小结
摸鱼两天…发奋图强的一天呢这真是,加油!
题型还是比较简单的那类
一点点开始变难和扣细节
加油! ! !