[C++语言规范]NOIP复赛易忘知识

本文深入探讨C++科学计数法表示、常量赋值方法、宏定义及一般语法定义,详解函数参数传递机制,包括按值和按引用传递的区别。此外,还介绍了文件操作优化、数据规模估算及整数、浮点数类型的选择,并提供了浮点数比较的正确方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

科学计数法

可以用来表示有理数,简化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代表只表示正数,字节数目也翻倍

推荐写法全部写法大体范围
shortshort (int)±3e4 (2byte)
unsignedunsigned (short int)/unsigned short (int)+6e4 (2byte)
longlong / int / long int±2e9 (4byte)
unsigned longunsigned long (int)+4e9 (4byte)
以下类型在NOIP比赛中禁止使用
推荐写法全部写法大体范围
long longlong long (int)±9e18 (8byte)
unsigned long longunsigned 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)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值