lqb日志02

一只小蒟蒻备考蓝桥杯的日志

文章目录

    • 笔记
      • 素数筛
        • 欧拉筛Eluer
        • 埃氏筛
        • 平方探测
      • 快排 sort
      • 回文数
      • 三维数组
    • 刷题
    • 心得
    • 小结

笔记

素数筛

欧拉筛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

参考 C++ sort()排序详解

#include 

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循环一个个输出

刷题

  1. P1055 [NOIP2008 普及组] ISBN 号码
  2. P5723 【深基4.例13】质数口袋
  3. P1217 [USACO1.5] 回文质数 Prime Palindromes
  4. P2615 [NOIP2015 提高组] 神奇的幻方

心得

  1. 第1-2题都很简单…入门罢了
  2. 第3题(回文质数),小小总结一些
    1. 找回文的素数,考虑到回文数少,避免超时,要先打回文数,枚举
    2. 偶数位的回文数,除了11,都不是素数
    3. 这次呆呆地一个个独立的for组合从1位打到7位,发现之前是组合式打(上附)优点是代码短,缺点是要快排一下
  3. 第4题(幻方)纯纯无脑跟着题目走就行,只是容易脑抽
    1. 一会第一行,一会最后一行,难绷
    2. 强烈要求,不管题目看似多么简单模拟,先拿小数据样例模拟走一边(或者说,至少把告知的模拟点都走一遍,免得理解错误,辛辛苦苦白写)
    3. 建议这种,switch-case、else-if型,不用偷懒滥用else和default,把它们用作异常报错
    4. 如果还是很不幸出错了,从小数据样例出发,找到第一个出错的点,回溯找到上一个失误点
  4. 第5题没有真正写,总体思路,打表
    1. 三维数组瞅一眼吧(上附)
    2. 很巧妙的一种思路,比如说,已知要输出5行,每个数据是以5x5的大小打印的(人脑5x5块状打印,但电脑只能一行行打印),可以用string ans[5] 把每行的答案先记录下来(形如 ans[i] += “12345”)统一输出

小结

摸鱼两天…发奋图强的一天呢这真是,加油!
题型还是比较简单的那类
一点点开始变难和扣细节
加油! ! !

你可能感兴趣的:(蓝桥杯日志,c语言,算法,蓝桥杯,c++)