Live2D

【读书笔记】《王道论坛计算机考研机试指南》 第四、五章

先分享一下《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个,则考试时可能会判超时;

posted @ 2020-02-26 00:18  WSquareJ  阅读(323)  评论(0编辑  收藏  举报