PAT《算法笔记》的一些代码技巧和个人心得

简介:

  在c++语言有一些基础的情况下,针对个人认为在PAT考试中可以使用的比较有效的代码技巧、比较容易遗忘、容易混淆、需要重点记忆的知识点进行了一些简单的总结。

2020.1.15 第二章 c++入门

1、变量的第一个字母必须是字母或者下划线
2、整形变量int的取值范围为 − 2 31 -2^{31} 231~( 2 31 − 1 2^{31}-1 2311),可以简单记成绝对值在 1 0 9 10^{9} 109以内的整数都可以定义为int类型
 整形变量long long的取值范围为 − 2 63 -2^{63} 263~( 2 63 − 1 2^{63}-1 2631),可以简单记成绝对值在 1 0 18 10^{18} 1018以内的整数都可以定义为long long类型。
 因此,在题目中出现计算结果超过 1 0 9 10^{9} 109并且小于 1 0 18 10^{18} 1018的变量都必须要使用long long类型保存,否则会发生溢出而导致结果错误。
3、如果给long long型赋大于 2 31 − 1 2^{31}-1 2311的初值,需要在初值后面加LL,否则会发生错误。

long long bignum=123456789012345LL;

4、浮点型变量:float的实际精度为6 ~ 7位,double的实际精度为15 ~ 16位。为保证结果精度,在做题的绝大多数情况下都是直接把浮点型变量定义为double即可。
5、double型变量在读入和输出的时候使用不一样的格式符

double a=12.34;
scanf("%lf", &a); //scanf读入double类型变量使用%lf
printf("%f", a); //printf输出double类型变量使用%f

6、小写字母比大写字母的ASCII码值大32
7、可以使用连续等号的方法将多个变量赋同一个值

int n, m;
n = m = 5;

8、如果有类似13:45:20这种格式为hh:mm:ss的时间需要输入,可以使用如下代码的方法:

int hh,mm,ss;
scanf("%d:%d:%d",&hh,&mm,&ss);

9、如果要读入3 4这样用空格隔开的两个数字,两个%d之间可以不加空格

int a,b;
scanf("%d%d",&a,&b); //两个%d之间可以不加空格

可以不加空格的原因是:scanf对其他格式符(如%d%s)的输入是以空白符(即空格、换行等)为结束判断标志。
但是,需要强调和注意的是:scanf的%c格式是可以读入空格与换行的!初学者在读入多种数据类型混合的数据时,会出现数据还没有输入完就输出结果或者数据输入完毕后没有输出的情况,这都是数据没有正确读入所导致的。

以下是一个scanf读入的例子,请读者根据输入输出结果进行思考,检验一下是否和自己预想的输出结果一致:

#include<stdio.h>
int main(){
    
    
	int a;
	char c,str[10];
	scanf("%d%c%s",&a,&b,&c);
	printf("a=%d,c=%c,str=%s",a,c,str);
	return 0;
}

输入数据

1 a bcd

输出数据

a=1,c= ,str=a

scanf不要忘记写&!!!,忘记写的后果是编译器不会报错,但是程序运行程序之后会得出错误结果,而且有时不会异常退出。

PS:也可以使用getchar()函数读掉行末的换行符
若想读取包含空格在内的一整行字符串,可以使用如下方式:

#include<cstring>
string str;
getline(cin,str);

10、想要输出%\,需要在前面再加一个%\

printf("%%");
printf("\\");

11、三种实用的输出格式:%md,%0md,%.mf
12、memset函数的格式为

memset(数组名,值,sizeof(数组名));

例如:将数组元素全部复制为0

int a[10];
memset(a,0sizeof(a);

13、可以使用sscanf()sprintf()char[]数组中读取数据或把数据输出到char[]数组中(就像scanf和printf从屏幕中读入和输出)

#include<cstdio>
char str[100]; //注意!这里是char[]数组,而不是STL中的string类型
sscanf(str,"%d",&n);
sprintf(str,"%d",n);

使用它也可以进行复杂的格式输入和输出,类似第8条

当然,如果你不愿意使用char[]数组,可以像我在最后补充里所说的那样,使用s.c_str()将string转换为char[]数组

string s;
sscanf(s.c_str(),"%d",&x); //可以不使用char[]数组

14、补充上一条,也可以使用stringstream把标准输入输出流重定向,从一个string中进行输入输出,虽然速度比sscanf和sprintf更慢了,但是也不是不能用,有些时候可以起到简化代码的作用(例如PAT A1022 Digital Library一题中,在读入Line #4: the key words时可以使用此技巧)

#include<sstream>
#include<cstring>
string line;
stringstream ss(line);
int sum=0,x;
while (ss>>x) sum+=x;

15、结构体中写过构造函数后,在新建一个结构体变量时可以通过构造函数进行初始化

这一章的最后补充(关于输入输出的速度问题):

  scanf、printf函数要比标准输入输出流的cin、cout速度要快,在数据输入量大的时候,使用cin、cout甚至会导致程序超时。但在平时使用时,个人还是更习惯使用cin、cout进行输入输出,为了防止超时,可以在main函数的第一句加上ios::sync_with_stdio(false);(关闭流同步),很好用。但要注意,在关闭流同步时,cin、cout和scanf、printf这两组输入输出方式不可以混用,否则会出错。

  此外,STL中的string类型速度也是较慢的,并且string类型只能使用cin、cout进行输入输出,无法使用scanf、printf函数,所以需要用char[]数组类型处理字符串来避免超时(而且有时加上ios::sync_with_stdio(false);仍然超时),但在平时使用时,个人还是更习惯使用string,为了防止超时,可以使用s.c_str()将string类型转换为char[ ]类型,再使用printf输出,使用方法如下。

#include<cstring>
string s;
printf("%s",s.c_str()); //使用s.c_str()将string类型转换为char[]类型,再使用printf输出

  还有,在PAT的题目中,经常会出现浮点数结果输出需要保留x位小数精度的情况,若使用输入输出流来控制精度,需要使用如下代码:

#include<iomanip>
cout<<setiosflags(ios::fixed)<<setprecision(2)<<123.4567<<endl; //保留两位精度

  是不是有一点点难记?在刚刚提到的第11条中,有一种输出格式%.mf可以用来控制浮点数的精度,这个方法是比c++中的方法更方便记忆和书写的。
  至此,除了小数的精度控制需要使用printf语句外,懒得书写scanf和printf语句格式化的同学一律可以使用cin、cout加上述补充的ios::sync_with_stdio(false);s.c_str(),可以节省输入输出语句的书写时间而且不用担心超时问题。

猜你喜欢

转载自blog.csdn.net/qq_32815551/article/details/112077518
今日推荐