pat浙大C语言刷题,【持续更新】【pat】pat刷题技巧记录

修改code completion快捷键位CTRL+ENTER,帮助提示函数名称

修改命令行提示符的属性,开启快速编辑模式,方便调试

添加c++11语言标准支持

开启代码调试功能

对输入的字符串进行切割时,可以使用scanf按照指定格式分别输入达到切割效果,比如:

//对于这样的输入

3-10 99

11-5 87

102-1 0

//对于这种格式不绝对统一的字符串,可以自己构造相应的scanf分割对应的数据

scanf("%d-%d %d", &t, &num, &score);

对于需要进行除法运算的变量,并且有精确度要求的时候,可以这样

double grade =0;

//其中fullscore数组为int类型,在*1.0小数之后,自动转换为浮点型

grade += fullscore[j] * 1.0 / 2;

//或者这样强转

grade += (double)fullscore[j]/2;

如果在getline读取行之前还有其它的输入字符(不管是字符还是整数),则需要保证在调用getline函数之前,使用getchar()函数读取一次回车符,然后再调用

#include

using namespace std;

int main() {

char n;

scanf("%c",&n);

getchar();

string str;

getline(cin,str);

cout<

}

散列表的应用:在需要进行遍历数组内容,判断某一个元素是否存在时,可以使用一个大数组,初始化为0,录入数据时,相应数据(把下标看成数据)的内容修改为1,这样判断的时候直接判断a[element]==1即可,其中element为录入的数据。这样就把O(n)级别的时间复杂度降到了O(1)

atoi&stoi(stol)&strtol区别

即使不记得也没关系,只要记住以下用法即可

//数字型变量转字符串

to_string();//c++全局函数

//字符串转数字

stoi();//to int

stol();//to long

stof();//to float

//都需要导入#include

四舍五入,可以先double +0.5然后转int取整数部分,也可以用cmath的函数round()

数组,字符串或其它常用stl容器大规模清零或者填充数据可以使用fill()函数

// fill algorithm example

#include // std::cout

#include // std::fill

#include // std::vector

int main () {

std::vector myvector (8); // myvector: 0 0 0 0 0 0 0 0

std::fill (myvector.begin(),myvector.begin()+4,5); // myvector: 5 5 5 5 0 0 0 0

std::fill (myvector.begin()+3,myvector.end()-2,8); // myvector: 5 5 5 8 8 8 0 0

std::cout << "myvector contains:";

for (std::vector::iterator it=myvector.begin(); it!=myvector.end(); ++it)

std::cout << ' ' << *it;

std::cout << '\n';

return 0;

}

output

myvector contains: 5 5 5 8 8 8 0 0

将十进制a转换为b进制数,当a不为0时,将a%b从后往前倒序保存下来,每次保存后将a/b。这样倒序保存的数就是十进制a在b进制下的结果。

进制互转代码参考如下

#include

#include

using namespace std;

int main(){

//把8进制的17转化为10进制打印输出

string str = "17";

char *tmp ;

long result = strtol(str.c_str(),&tmp,8);

cout<

return 0;

}

#include

#include

using namespace std;

//digital为10进制数,r为需要转换的目标进制,返回目标进制数

string dtox(int digital,int r){

string result="";

const char s[37]="0123456789abcdefghijklmnopqrstuvwxyz";

if(digital==0){

return "0";

}

while(digital!=0){

int tmp =digital%r;

result+=s[tmp];

digital/=r;

}

reverse(result.begin(),result.end());

return result;

}

int main(){

cout<

cout<

cout<

cout<

}

尽量使用c++的string类

读取整行的代码如下

string str;

getline(cin,str);//该函数在std标准库中,不需要引入string头文件

c++的string类可以转化为c的字符数组,str.c_str();

int gcd(int a,int b){

return b==0?a:gcd(b,a%b);

}

int lcm(int a,int b){

return a*b/gcd(a,b);

}

对于一些可以事先进行预处理然后用散列表来求解的问题,可以大大减少时间复杂度。比如一个需要大量查询斐波那契数列的问题中,我们可以事先把前N个斐波那契数列求解出来然后放到散列表中进行保存,之后的查询就都是O(1)的时间复杂度。

▲多利用位运算来求解交集,并集,差集,可以大大减少时间复杂度,降低编码难度。

素数的判断

bool isPrime(int n){

if(n <= 1) return false;

int sqr = (int)sqrt(1.0*n);

for(int i = 2;i<=sqr; i++){

if(n%i==0) return false;

}

return true;

}

常用C++ STL容器

C++ container

algorithm头文件常用函数

algorithm

max

min

abs

swap

reverse

is_permutation

next_permutation

prev_permutation

fill

sort

lower_bound

upper_bound

大数组必须定义为全局变量

字符数组要多开一个单位

string.find()返回的是下标的值,没有找到用==string::npos

本文持续更新,敬请关注

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值