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

第四章 数学问题

一、%运算符

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

{

prime[i]=true; //此种为标记 prime[i]为1表示i是质数

}

for(int k=2;k

{

if(prime[k])

{

for(int i=k*k;i

{

prime[i]=false;

}

}

}

}

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

int primesize=0;

bool mark[MAX];

int prime[MAX];

void preprime()

{

for(int i=2;i

{

mark[i]=true;

}

for(int i=2;i

{

if(mark[i]==false) continue; //已被标记不是质数

prime[primesize++]=i; //得到新质数

for(int j=i*i;j

{

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<

第五章 图论

预备知识

1.使用vector实现邻接链表

struct Edge{

int nextNode; //用int作为指针,

int cost;

};

vector edge[n]; //由于使用了容器,所以结构体用int作为指针不会混淆前后关系

//链表初始化

for(int i=0;i

edge[i].clear(); //清空单链表但保留空间

}

//然后将邻接点压入到它对应的容器内即可

并查集union-find

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

最短路径

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值