[蓝桥杯]真题知识点及分析思路总结

好久不见. 提交于 2020-04-27 20:51:34
【基础】
c/c++常用头文件:

#include<iostream>

#include<cstring>

#include<algorithm>

using namespace std;

#define N 100001 


快速排序函数:

sort:

bool compare(int x,int y)
{ //>是从大到小,<从小到大(默认)
return x>y;
}
sort(b,b+m,compare);        //默认从小到大


全排列函数:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int ans[4]={1,2,3,4};
    sort(ans,ans+4);
    do{
        for(int i=0;i<4;i++)
        cout<<ans[i]<<" ";
        cout<<endl;
    }while(next_permutation(ans,ans+4));
    return 0;
}

【1】把做过的题好好复习、理解。
1.      %.3f保留3位小数并四舍五入;

2.       &&的优先级要高与||
&&有点类似于*,||类似于+

逻辑运算符里!的优先级最高;


3.      if(1)

              if(b)

                     x++;

              else  //else默认和最近的一个if配对

                     y++;



5.      要记得ACII表中,A为65,a为97;

Aa Bb Cc Dd Ee Ff Gg Hh Ii Jj Kk Ll Mm Nn Oo Pp Qq Rr Ss Tt Uu Vv Ww Xx Yy Zz

6.      Double类型的数据输入要用%lf,输出用%f就可以了;

7.      EOF符号直接指一个空

8.      注意一个数输出的格式,如%.1lf表示double类型保留一位小数输出,而且这个格式默认是四舍五入的;


9.      求a,b两个数的最大公约数,用以下算法

      while( b > 0)

      {

             int t = a % b;

             a = b;

             b = t;

      },得出的a就是最大公约数了。具体理解用长度不一的棒子模拟。

10.if(fabs(m*my-n*ny)<0.000001//浮点数判断相等,要近似判断,如果用==得不到结果。fabs(float x)浮点数x的绝对值   来源 蓝桥杯 鸡蛋的数目
2】基本数学知识汇总
1.质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

2.互质数为数学中的一种概念,即两个或多个整数的公因数只有1的非零自然数。公因数只有1的两个非零自然数,叫做互质数。

3.模运算

运算规则
模运算与基本四则运算有些相似,但是除法例外。其规则如下:   
 
(a + b) % p = (a % p + b % p) % p (1)   
 
(a - b) % p = (a % p - b % p) % p (2)   
 
(a * b) % p = (a % p * b % p) % p (3)   
 
ab % p = ((a % p)b) % p (4)   
 
结合率:
 
 ((a+b) % p + c) % p = (a + (b+c) % p) % p (5)   
 
((a*b) % p * c)% p = (a * (b*c) % p) % p (6)  
 
 
 
交换率: (a + b) % p = (b+a) % p (7)   
 
(a * b) % p = (b * a) % p (8)   
 
分配率: ((a +b)% p * c) % p = ((a * c) % p + (b * c) % p) % p (9) 
同余定理

公式入下:例如:1234%10
 
首先整数都可化成如此形式,如1234化成((1*10+2)*10+3)*10+4
 
进行求余(((1*10+2)*10+3)*10+4)%10
 
此时用到两个公式
 
(a+b)%c=(a%c+b%c)%c
 
(a*b)%c=(a%c*b%c)%c
 
计算过程比较麻烦,多次正反运用公式最终能得到
 
1234%10=(((1%10*10+2)%10*10+3)%10*10+4)%10
【高次方数的尾数】

乘法规律发现:乘积的后三位值只与 乘数与被乘数的后三位有关,与乘数和被乘数的高位无关。

【阶乘尾数零的个数】

规律:1-100中   凡是有因子5,尾数就增加一个零;有因子25,尾数就增加两个零。

100!有24个零,1000!有249个零。


#include<stdio.h>  
 
int main()  
{  
    int i,j,k;  
    int num2=0; // 与2相乘的次数  
    int num5=0; // 与5相乘的次数  
  for(i=1;i<=100;i++)  //100!
   {  
        j=i;  
         while((j%2)==0) // 对每个数分解,看包含多少个2  
        {  
           num2++;  
           j=j/2;  
       }  
       j=i;  
       while((j%5)==0) // 对每个数分解,看包含多少个5  
         {  
             num5++;  
             j=j/5;  
         }  
    }  
    printf("%d\n",(num2>num5?num5:num2)); // 找出2和5相乘次数少的,就是多少个2x5的对,就有多少个0  
    return 0;  
 }  

【大衍数列】
中国古代文献中,曾记载过“大衍数列”, 主要用于解释中国传统文化中的太极衍生原理。
它的前几项是:0248121824324050607284...

int main()
 
{
 
int i;
 
for(i=1; i<100; i++){
 
    if(i%2==0) //填空
 
        printf("%d \n", i*i/2);
 
    else
 
        printf("%d \n", (i*i-1)/2);
 
}
 
printf("\n");
 
}




数字规律:13610,,,,,

公式:i*(i+1)/2


【做过有关题的答案】

88*88=7744     四位数中唯一aabb型数

【补充-常识】

一年的12个月:1-12月

3128/2931303130313130313031

闰年:

(year%4==0&&year%100!=0)||(year%400==0)
【3】API文档的熟悉-常用函数
【4】刷题




【常用算法】
斐波那契(记忆化搜索)

int memo[MAX_N + 1];  
int fib(int n) {  
    if (n <= 1) return n;  
    if (memo[n] != 0) return memo[n];  
    else return memo[n] = fib(n-1) + fib(n-2);  
}
    2.全排列n个元素(非常好用)

//k:当前交换位置与其后元素交换  
public static void f(char[] data, int k){  
    if (k == data.length) {  
        for (int i = 0; i < data.length; i++)  
            system.out.print(data[i] + " ");  
        system.out.println();  
    }  
    for (int i = k; i < data.length; i++) {  
        char t = data[k]; data[k] = data[i]; data[i] = t;//试探  
        f(data, k + 1);  
        char t = data[k]; data[k] = data[i]; data[i] = t;//回溯  
    }  
}
    3.辗转相除法求最大公约数

int gcd(int a, int b) {  
    if (b == 0) return a;  
    else return gcd(b, a % b);  
} 
    4.埃氏筛法(搜索n以内的所有素数)

int prime[MAX_N];//第i个素数  
bool is_prime[MAX_N + 1];  
 
//返回n以内素数的个数  
int sieve(int n) {  
    int p = 0;
    for (int i = 0; i <= n; i++)  
        is_prime[i] = true;  
    is_prime[0] = is_prime[1] = false;  
    for (int i = 2; i <= n; i++) {  
        if (is_prime[i]){  
            prime[p++] = i;  
            for (int j = 2*i; j <= n; j += i)  
                is_prime[j] = false;  
        }  
    }  
    return p;  
} 
    5.快速幂运算(反复平方法)

    

//计算:x^n % mod  
int mod_pow(int x, int n, int mod) {
    int res = 1;  
    while (n > 0) {  
        if (n & 1)  
            res = res * x % mod;  
        x = x * x % mod;  
        n >> = 1;
    }  
    return res;  
} 
    6.筛选法求素数

memset(vis,0,sizeof(vis));  
for (int i=2;i<=n;i++){  
    for (int j=i*2;j<=n;j+=i) vis[j]=1;  
}  
  
//升级版  
int m=sqrt(n+0.5);  
memset(vis,0,sizeof(vis));  
for (int i=2;i<=m;i++)   
    if (!vis[i])  
    for (int j=i*i;j<=n;j+=i) vis[j]=1; 
素数定理 不超过x的素数个数近似(略超过) x/lnx;

7.三种求模:

(a+b)%n=(a%n+b%n)%n;  
(a-b)%n=(a%n-b%n+n)%n;   
a*b%n=a%n*(b%n)%n;//乘法注意不要越界!!  
大数例如10的100次方取模:
将大数例如1234表示为(((1*10+2)*10+3)*10+4),然后利用上述公式求结果;

8.快速幂取模,循环实现,原理就是把指数分解为二进制数表示,代码如下:

long long quick_mod(long long a,long long b){  
    long long res=1;  
    while(b!=0){  
        if (b%2==1) res*=(a%n);  
        a=a*(a%n);  
        b/=2;  
    }  
    return res;  
}  
9.但是当数据量大于10^19时,longlong会爆,所以利用快速乘法,原理类似,a*b就是b个a相加,将b表示为二进制:

int n;  
long long mul(long long a,long long b){  
    long long res=0;  
    while(b!=0){  
        if(b%2==1) res=(res+a%n)%n;  
        a=(a%n+a%n)%n;  
        b/=2;  
    }  
    return res;  
}  
  
long long quick_mod(long long a,long long b){  
    long long res=1;  
    while(b!=0){  
        if (b%2==1) res=mul(res,a)%n;  
        a=mul(a,a);  
        b/=2;  
    }  
    return res;  
} 
10.唯一分解定理:
又称为正整数的唯一分解定理,即:每个大于1的自然数均可写为质数的积,而且这些素因子按大小排列之后,写法仅有一种方式。
所以一个数可以表示成一个已知质数数组(刷选法得到)得到的数组e,e里面存各个质数的指数,比如15表示为e{1,1,0,0...}的方式;

void fenjie(int n){  
    for(int i=0;i<primes.size();i++){  
        while(n%primes[i]==0){  
            n/primes[i];  
            e[i]++;  
        }  
        if (n==1) break;  
    }  
} 

/*
刷题OJ:
基础:https://login.codevs.com/auth/login
进阶:http://acm.hdu.edu.cn/

蓝桥杯省赛知识点
1、C++ STL 常见算法
2、C++ 输入输出(包括流、文件)
3、C++常用泛型:list vector stack map
4、暴力穷举
5、递归
6、全排列 next_permutation 康托展开式
7、回溯
8、DFS、BFS、hash表
9、数学上的有:辗转相除(两行内),素数等

国赛知识点
1、hash表
2、大数(高精度)加减乘除 
3、线段树
4、并查集
5、图论相关算法:最短路(Floyd、Dijstra,BellmanFord)、最小生成树(prim,kruscal要用并查集) 
6、熟悉动态规划的各个典型:LCS、最长递增子串、三角剖分、记忆化dp 
7、博弈类算法:博弈树,二进制法等。
8、双向广度搜索、A*算法,最小耗散优先
9、数学:线段交点、多角形面积公式等
*/

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!