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