[C++语言规范]NOIP复赛易忘知识
科学计数法
可以用来表示有理数,简化0的部分书写
e前面的数字代表基础部分(可带小数) e代表乘以 e后的数字代表10的次方
double a = 1.5e3; // a= 1500
double b = 2e-2; //b = 0.02
double c = -1.7e2; //c = -170
double c = 1.7e2; //c = 170
常量赋值的两种方式
宏定义
相当于编译的时候直接替换同名的常量名(写在开头)
#define PI 3.14159265359
…
cout<<PI<<endl; //编译后等价于cout<<3.14159265359<<endl;
…
一般语法定义(需要带上数据类型)
const double PI=3.14159265359;
…
cout<<PI<<endl; //编译后等价于cout<<PI<<endl;
…
函数的传参数问题
传实参(重要only added ‘&’ in function)
直接修改传入的函数“永久性”
void swap(double &a,double &b){
int temp=a;
a=b;
b=a;
}
…
double a=5;
double b=2;
swap(a,b);
cout<<“a=”<<a<<“b=”<<b<<endl;//输出a=2b=5
…
传实参
直接修改传入函数的副本,原函数不变
void swap(double a,double b){
int temp=a;
a=b;
b=a;
}
…
double a=5;
double b=2;
swap(a,b);
cout<<“a=”<<a<<“b=”<<b<<endl;//输出a=5b=2
…
文件操作
重定向版freopen
编者提醒:使用此项优化后stdio库和cstdio的一系列函数请不要使用,否则会出现意想不到的结果
引用优化流同步 https://blog.youkuaiyun.com/hanziyuan08/article/details/53008676
很多人会说cin的速度比scanf慢很多, 其实不然.
cin慢的原因主要在于默认cin与stdin总是保持同步, 这一步是消耗时间大户.
只需要加上std::ios::sync_with_stdio(false)来关闭同步就好了, 速度甚至要优于scanf
引用 https://www.cnblogs.com/flipped/p/5543169.html
这句语句是用来取消cin的同步,什么叫同步呢?就是iostream的缓冲跟stdio的同步。如果你已经在头文件上用了using namespace std;那么就可以去掉前面的std::了。取消后就cin就不能和scanf,sscanf, getchar, fgets之类同时用了,否则就可能会导致输出和预期的不一样。
int main(){
std::ios::sync_with_stdio(false);
freopen("read.in","r",stdin);
freopen("read.out","w",stdout);
//正常代码段
fclose(stdin);fclose(stdout);
}
数据规模估算
Ibyte(字节)=8bit(一般以byte为准,1bit相当于一个开关1/0)
整数
基础字节数是2位(16bit)大约是-(215)~215-1 (一个符号位被占用)
如果符号位没有被占用即只表示正数 大约是0~216-1
long代表字节数目翻倍
unsigned代表只表示正数,字节数目也翻倍
推荐写法 | 全部写法 | 大体范围 |
---|---|---|
short | short (int) | ±3e4 (2byte) |
unsigned | unsigned (short int)/unsigned short (int) | +6e4 (2byte) |
long | long / int / long int | ±2e9 (4byte) |
unsigned long | unsigned long (int) | +4e9 (4byte) |
以下类型在NOIP比赛中禁止使用
推荐写法 | 全部写法 | 大体范围 |
---|---|---|
long long | long long (int) | ±9e18 (8byte) |
unsigned long long | unsigned long long | +1.8e19 (8byte) |
实数(浮点数)
基础位数是4位
全部表示正负数无unsigned
阶梯式翻倍字节数目由于涉及特殊存储格式,有效字节数比较少
| 写法 | 大体范围 |
|–|--|–|
| float | ±3e-38 (4byte) |
| double | ±3e-308 (8byte) |
以下类型在NOIP比赛中禁止使用
写法 | 大体范围 |
---|---|
long double | ±3e-4932 (16byte) |
浮点数比较(重要)
由于浮点数的储存格式问题(你看它变态的保存范围就知道)
其实是无法完全表示的(二进制底层储存格式决定)只能是取一个大致的范围存在误差
所以浮点数的比较不能简单的==来运算
如果fabs(a-b)<=1e-6,那么就是相等了。 fabs是求浮点数绝对值的函数。
类似的 判断大于的时候,就是if(a>b && fabs(a-b)>1e-6)。
判断小于的时候,就是if(a<b&&fabs(a-b)>1e-6)。