今天和PAT无直接相关的关系,主要是关于一些语法/算法的笔记,因为我发现自己的基础还没有打扎实,有些时候看别人的代码还会觉得一头雾水,不明白代码的含义。
一些C/C 语法
先从语法开始吧。这部分很琐碎简单,如果没兴趣的话建议跳过(毕竟其实是很基础的东西,而且主要是C)。
注意scanf("%d", &a);
中的&
,一定要有。
不要同时使用cout
、printf
,否则会出BUG。建议刷题的时候使用scanf
和printf
,更加省时。
通常<stdio.h>
之类的库在C 中用<cstdio>
来代替,例如#include <stdio.h>
换成#include <cstdio>
。<cstdio>
, <cmath>
, <cstring>
。
数据类型 | 大致范围 | 占用位数 | 备注 |
---|---|---|---|
int | -2*109~2*109 | 32 | |
long long | -9*1018~9*1018 | 64 | long long bignum = 123456789012345LL一定要有LL |
float | 6~7位精度 | 32 | 尽量别用,1位符号8位指数23位尾数 |
double | 15~26位精度 | 64 | 1位符号11位指数52位尾数,double和float都是%f作为输出格式 |
char | -128~ 127 | 8 | 输出格式:%c |
bool | 0/1 | 1 | 0False/1True |
强制转换类型:(int)a
。
设置常数:const double pi=3.14159;
,推荐使用这种方式而不是直接用#define
来设置常数。
注意关系运算符的写法是<=
和>=
。
逻辑运算符:&&
、||
、!
。
位运算符:<<
、>>
、&
、~
、|
、^
。
注意数组名称本身代表了数组第一个元素的地址,所以不需要再加取地址运算符。
如果要输入“3 4”之类用空格隔开的两个数字,两个%d
之间可以不加空格,因为除了%c
,scanf对其他格式的输入是以空白符为结束判断标志的,所以会自动跳过空格。
此外,%c
是可以读入空格和换行的。
可以用getchar
来输入字符,例如c1 = getchar();
练习
先上个输入输出的,这里是codeup题号为1000的练习,直接给出源代码:
代码语言:javascript复制#include <cstdio>
using namespace std;
int main(void){
int first, second;
while(scanf("%d%d", &first, &second)!=EOF){
printf("%dn", first second);
}
}
多点测试,要注意codeup是一次性给出所有的测试数据,是多点测试,代码必须要能够处理所有数据的输入,后台指挥运行代码一次来测试不同的数据,这点和PAT不同。
常用的math函数
这里的函数在使用的时候要记得#include <math.h>
。
fabs(double x)
取绝对值,例子:
代码语言:javascript复制int main(){
double db = -12.56;
printf("%.2fn", fabs(db));
return 0;
}
输出的结果:
代码语言:javascript复制12.56
floor(double x)
和ceil(double x)
就是向下取整和向上取整(floor,地板,向下,ceil天花板,向上),具体用法和fabs类似,不重复了。
pow(double r, double p)
就是计算幂函数,返回值是
,例如pw(2.0, 3.0)
返回
。
sqrt(double x)
取开方。
log(double x)
就是取以自然对数为底的对数。
sin(double x)
、cos(double x)
、tan(double x)
、asin(double x)
、 acos(double x)
、atan(double x)
三角函数,不解释。
round(double x)
四舍五入取整。
练习
很简单的练习,这里就不放代码了,练习地址。
冒泡排序
这个是最基础的算法,本质就是交换,每次都通过交换的方式把当前剩余元素的最大值移动到一端,当剩余元素减少为0的时候排序结束。给个图理解下:
上图只是其中一次,类似上面的步骤要执行多几次,直到所有的元素都是按照从小到大的顺序排列为止。
直接上代码:
上图代码来自书《算法笔记》,作者是胡凡。强烈建议自己敲一遍,不要复制。