PAT:那些年我们卡过的坑

79 篇文章 0 订阅

报错:

  • fatal error: bits/stdc++.h: No such file or directory|
    原因:将c++误建成c文件

审题篇:

注意非负,非正,负数…

输入

  1. 注意输入的格式,要在scanf()中吸收多余的字符:如12:20中的:

TIPS

  1. C中自带的常量:
    INT_MAX, INT_MIN
    LONG_MAX, LONG_MIN
    FLT_MAX, FLT_MIN
    DBL_MIN, DBL_MAX
    包含在头文件climits中

【注】要将min设为INT_MAX(无穷大), max设为INT_MIN(无穷小) !!注意别搞反了!!

  1. algorithm中的min_element(first, last, cmp)max_element(first, last, cmp)

1)这两个函数都可以返回一个数组(或vector)中最大最小值的迭代器it,通过*it 就可以找到相应的元素,it - begin()即再数组中的位置
2)最后一个参数可以是函数指针,也可以是函数对象,定义<的意义(比较规则),可省略(即按照默认:1<2)

  1. 记得测试边界数据:1, 230 = 1073741824 = (int)pow(2.0, 30.0);

  2. int占32位的时候,最大可以赋值为:2147483647。也就是0x7fffffff (0,1111…1111)

  3. 断素数:使用sqrt函数会慢一些,不如在for循环里直接i*i<n

TIPS 1:sprintf(digit, “%d”, sum): 将数字sum按位,以"%d"格式,写进char型数组digit的

  • TIPS 1: substr()用法

1.substr(str, start, len)str.substr(start, len) :从str的start位置开始提取字符串

2.len:要提取字符串的长度,若length为以下任意条件之一时,返回start位置到串尾的所有字符:
1)不指定 | 2)为空 | 3)负数 | 4)大于start到串尾的长度

  • TIPS 2: stoi()用法

1.头文件#include<cstring>
2.stoi(const string*) 传入一个string,返回对应的int
3.要包含c++11:在编译器设置里添加-std=c++11

  • TIPS 3: erase()用法

string& erase ( size_t pos = 0, size_t n = npos );
1.使用迭代器
1)s.erase(it); //删除it 2) s.erase(fiest, last); //删除[first, last)
2.使用位置
s.erase(pos, n) //从pos开始删除n个元素

  • TIPS 1:
    sscanf(str, "%lf", &tmp);:将str以浮点数形式写入tmp,若格式不符,不写入

  • TIPS 2:
    sprintf(str, "%.2f", tmp);:将tmp(浮点数形式)以.2f格式写入str,若tmp与.2f格式不匹配:如char tmp[]:输出0.00,但换成"%d"就输出 7405072不知道什么原理

这两个函数都只对char 数组有效:string要转化为char数组,即:str.c_str()

短路原理:
TIPS 1:
C语言中:||或运算符,只判断前半部分是否为true,若前半部分为true,就不继续看后面了

可以用%*c吸收一个字符,代替getchar(), 如scanf("%*c%c", &c);

TIPS 1: 关于scanf() != EOF
scanf()的返回值为:输入值的个数,若没有输入返回-1(EOF == -1)
~: 按位取反,-1取反为0 --> 可以通过while(~scanf())来判断是否输入完

WRONG

  1. 多层循环:千万别把i, j 写错!!找瞎你!!

  2. 别忘了N!!!
    每次都被这个N骗了,注意输入为序列时,第一个是N(数组长度),不是第一个元素!!

eg.

3 2 3 1	//3是输入的个数,不是一个输入!!!

PAT 1002: 多项式加法
别忘了相加后系数为0的项, 同时控制输出格式是,最后一项的位置是不确定的(不一定是0)

PAT 10

  1. 若在循环里直接输出天数,别忘了最后一天也要处理,这里采用哨兵mile[n+1] = 0;,将最后一天平凡化处理
    否则须在循环外处理前n天都符合爱丁顿数的情况

Wrong:
第一次写的时候采用的是string存储,通过reverse函数判断是否回文,这样是不行的,因为n在b进制下每位可能>10,即不是一个单char
即:"12" - '0' != 12

//样例2:long long 过 10^72917超int范围

在这里插入图片描述
bool isPrime():注意for中i从2开始到sqr结束!!!

  • Wrong 1:size()返回的是无符号数,s.size()-k可能溢出成很大的数 ,可能导致无限循环!
  • Wrong 1:
    判断素数不要忘记1和0的情况,不属于素数

由于输入范围是10^10超int 范围,只能用string 存储运算(模拟整数运算),切记:中途也不能用int临时存某个变量

大整数加法:!!!for(int i = a.size()-1; i >= 0; --i){ //!!!:Wrong 1:要从后往前来

模拟分数的四则运算

  • TIPS 1:要注意乘法的过程中可能会溢出 -> 要使用long long 存储分子分母

Wrong: 字符串题:getline() 出问题可能是没吸收\n( getchar() )!! 这里要注意的是:上一次输入n时,会多出一个\n,要用一个getchar()或者cin.ignore()吸收掉,不然会影响下面getline()的读入

Wrong: a % 0会发生浮点数异常 Float Point Exception

PAT A1071 不能一个词一个词输入,因为can,can有两个word,但输入为一个str: separated by non-alphanumerical characters

PAT A1069

  • 坑点:
    Wrong 1:输入n (0, 104) 可能不足4位
    Wrong 2: 输入6174要计算一次,所以要do_whilewhile(s != "0000" && s != "6174");或者if_break

PAT A1149 break; //!!!:Wrong 1:不能提前break;后面还有数据要输入

PAT A1079 // Wrong 1: 脑抽开始写成 1.01 * r ( != 0.01 * r + 1)

TIPS 1:[Error] invalid types 'int[int]' for array subscript

与全局变量重名

vector child[maxn]

int child = child[now][i];

//多层循环输入数组时,下标别写错了! //!!!:Wrong 1: 里层循环j写成j!

在这里插入图片描述

在这里插入图片描述
AVL初始化时要初始化height

AVL:注意事项

Wrong 1:
一个节点的树的高度初始为1

Wrong 2:
getHeight()别忘了r==NULL的情况,空树高度0

Wrong 3:
左旋右旋操作后,更新r和tmp高度的顺序不能颠倒,要先更新下面的,再更新上面的(因为更新前r和tmp还没交换,所有tmp在上,先更新r)

Wrong 4:
注意返回值类型,如这里插入和L/R都是通过在传入参数node* &root直接修改,故返回值为viod:直接r上操作,不需要返回root了

Wrong 5:
插入里的左右判断,如果直接把左的情况复制粘贴到右的情况,千万不要忘记改rc/lc

error: invalid types 'int[int]' for array subscript 局部变量与全局变量重名:dijkstra中的int d 与全局d[]重名!

!!如果for里有输入,千万别提前break出for,否则数据输入不完!!!

48 43 C:\Users\fjjnbb\Desktop\asdads.cpp [Error] cannot pass objects of non-trivially-copyable type ‘std::string {aka class std::basic_string}’ through ‘…’ :
printf("%s ", string);

注意区分正还是非负!!!
图题节点分成2个阵营时,要考虑路径上是否能经过不同阵营!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值