zoukankan      html  css  js  c++  java
  • 【读书笔记】《王道论坛计算机考研机试指南》 第四、五章

    先分享一下《2013年王道论坛计算机考研机试指南》pdf
    链接:https://pan.baidu.com/s/1w_nfGVtU40pZrUggAYfQDA
    提取码:aaaa

    第四章 数学问题

    一、%运算符

    1. a%b中a、b必须为整型变量,不能为浮点数;b变量必须为非0值,否则程序异常终止;

    2. 若a为正数,则表达式结果为非负数;若a为负数,则表达式结果为非正数;与b的符号无直接关系,a%(-b)==a%b

    3.避免大数求模中的溢出问题,运用以下规律:

    (a*b)%c=(a%c*b%c)%c;
    (a+b)%c=(a%c+b%c)%c;
    

    二、数位拆解

    1. 例如输入a将其各个位上的数拆解开来,需预先判断是否为0,若不想预先判断则改用do while()句型,保证最少执行一次。

    int a;
    cin>>a;
    int k=0;            //下标
    if(a==0)            //这个判断是有必要的!
    {
        buf[k]=0;
    }
    while(a!=0)
    {
        buf[k++]=a%10;
        a=a/10;
    }
    

    2. 数位拆解可以使用字符串(string)形式存储,利用与'0'的差值进行其他操作

    三、进制转换

    附一个例题:十六进制转八进制

    四、最大公约数(GCD)

    求a和b的最大公约数:

    ·若a,b均为0,则最大公约数不存在;
    ·若a、b其中之一为零,则他们的最大公约数为a、b中非零的那个;
    ·若a、b都不为零,则使新a=b;新b=a%b;重复此过程

    int gcd(int a,int b)
    {
        return b!=0?gcd(b,a%b):a;
    }
    

    五、素数判定

    1.若使用测试是否整除的方法,则只需测试到sqrt(n)+1即可,这个界限可以先算出来而不放在循环的判断条件里,因为若放在循环条件里则每循环一次就要计算一次这个函数,较耗时。尽可能的避免重复工作。

    六、素数筛法

    1.标记法:(适用于范围不大得情况)

    #define MAX 10001
    bool prime[MAX];
    void preprime() 
    {
            for(int i=2;i<MAX;i++)
            {
                   prime[i]=true;         //此种为标记 prime[i]为1表示i是质数
            }                   
    	for(int k=2;k<MAX;k++)
    	{
    		if(prime[k]) 
    		{
    			for(int i=k*k;i<MAX;i=i+k)
    			{
    				prime[i]=false;
    			}
    		}
    	}
    }
    

    2.将质数筛出来放入另一个数组,后续好使用不用遍历每一个树

    int primesize=0;
    bool mark[MAX];
    int prime[MAX];
    void preprime()
    {
        for(int i=2;i<MAX;i++)
        {
            mark[i]=true;
        }
        for(int i=2;i<MAX;i++)
        {
            if(mark[i]==false)    continue;         //已被标记不是质数
            prime[primesize++]=i;                   //得到新质数
            for(int j=i*i;j<MAX;j=j+i)              //此质数的倍数均不是质数
            {
                mark[i]=false;
            }
        }
    }
    

    九、高精度整数

    1. 函数参数 const 修饰的变量在函数中不能改变其值

    2.高精度整数若为以下结构体,则若是一位data存储一个四位数(即由string类型读入的字符串的四位)输出时可使用printf("%04d",data[i])来保证输出为4位且高位补0;

    struct Bigint{
        int data[MAX];
        int size;
    };
    

    若使用C++则如下:

    cout.setf(ios::right);      //默认右对齐,此句可省略
    cout.width(4);              //此句设置宽度为7,默认不足用空格填充
    cout.fill('0');             //用0填充;
    //也可以直接输出时一部解决
    cout<<setw(4)<<setfill('0')<<data[i]<<endl;
    

    第五章 图论

    预备知识

    1.使用vector实现邻接链表

    struct Edge{
        int nextNode;      //用int作为指针,
        int cost;
    };
    
    vector<Edge> edge[n];   //由于使用了容器,所以结构体用int作为指针不会混淆前后关系
    
    //链表初始化
    for(int i=0;i<N;i++){
        edge[i].clear();        //清空单链表但保留空间
    }
    //然后将邻接点压入到它对应的容器内即可
    

    vector、stack、queue相关内容链接:https://www.cnblogs.com/wwj321/p/12381569.html

    并查集union-find

    1. n个顶点的连通图至少要有n-1条边(也就是树)才能保证图为连通图。(突然感慨一下离散要学好啊啊啊!指不定哪就用上了)

    最短路径

    1. Floyd算法复杂度O(n^3); 当问题中结点超过200个,则考试时可能会判超时;

  • 相关阅读:
    005 Python的IDE之Pycharm的使用
    006 Python的IDE之Jupyter的使用
    004 pip的使用
    003 Python解释器源修改
    002 Python解释器安装
    BZOJ 4567 [SCOI2016]背单词 (Trie树、贪心)
    BZOJ 2085 luogu P3502 [POI2010]Hamsters (KMP、Floyd、倍增)
    UOJ #219 BZOJ 4650 luogu P1117 [NOI2016]优秀的拆分 (后缀数组、ST表)
    UOJ #214 [UNR #1]合唱队形 (概率期望计数、DP、Min-Max容斥)
    LOJ #2542 [PKUWC2018]随机游走 (概率期望、组合数学、子集和变换、Min-Max容斥)
  • 原文地址:https://www.cnblogs.com/wwj321/p/12364816.html
Copyright © 2011-2022 走看看