运算符运算等级如下
其中 1级优先级最高,15级最低,
1级优先级 左结合
() 圆括号
[] 下标运算符
-> 指向结构体成员运算符
. 结构体成员运算符
2级优先级 右结合
! 逻辑非运算符
~ 按位取反运算符
++ 自增运算符
-- 自减运算符
- 负号运算符
(类型) 类型转换运算符
* 指针运算符
& 地址与运算符
sizeof 长度运算符
3级优先级 左结合
* 乘法运算符
/ 除法运算符
% 取余运算符
4级优先级 左结合
+ 加法运算符
- 减法运算符
5级优先级 左结合
<< 左移运算符
>> 右移运算符
6级优先级 左结合
<、<=、>、>=关系运算符
7级优先级 左结合
== 等于运算符
!= 不等于运算符
8级优先级 左结合
& 按位与运算符
9级优先级 左结合
^ 按位异或运算符
10级优先级 左结合
| 按位或运算符
11级优先级 左结合
&& 逻辑与运算符
12级优先级 左结合
|| 逻辑或运算符
13级优先级 右结合
? : 条件运算符
14级优先级 右结合
= += -= *= /= %= &= ^= |= <<= >>= 全为赋值运算符
15级优先级 左结合
, 逗号运算符
1.ACM一般采用C语言节约空间,要用C++库函数或STL时才用C++;
cout、cin和printf、scanf最好不要混用。
大数据输入输出时最好不要用cin、cout,防止超时。
2.有时候int型不够用,可以用long long或__int64型(两个下划线__)。
值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808)到2^63-1(+9,223,372,036,854,775,807 )之间的整数。
printf("%I64d",a); //__int64 一般VC编译器使用
printf("%lld",a); //long long 一般g++编译器使用
3.OJ判断是只看输出结果的。
所以大部分题处理一组数据后可以直接输出,就不需要用数组保存每一个Case的数据。
while(case--)
{scanf(...);
......
printf(...);
}
4.纯字符串用puts()输出。
数据大时最好用scanf()、printf()减少时间。
先用scanf(),再用gets()会读入回车。所以在中间加一个getchar();
scanf("%c%c",&c1,&c2)会读入空格;建议用%s读取字符串,取第一个字符。
5.
读到文件的结尾,程序自动结束
while( ( scanf( “ %d” ,&a) ) != -1 )
while( ( scanf( “ %d” ,&a) ) != EOF)
while( ( scanf( “ %d” ,&a) ) == 1 )
while( ~( scanf( “ %d” ,&a) ) )
读到一个 0 时,程序结束
while( scanf( “ %d” ,&a) ,a)
读到多个0时,程序结束
while( scanf( “ %d%d%d” ,&a,&b,&c),a+b+c ) //a,b,c非负
while( scanf( “ %d%d%d” ,&a,&b,&c),a|b|c )
6.数组定义int a[10]={0};可以对其全部元素赋值为0;
数组太大不要这样,防止CE。
全局变量,静态变量自动初始化为0;
7.有很多数学题是有规律的,直接推公式或用递归、循环。
8.圆周率=acos(-1.0)
自然对数=exp(1.0)
9.如果要乘或除2^n,用位移运算速度快。a>>n;a<<n;
10.定义数组时,数组大小最好比告诉的最大范围大一点。
字符数组大小必须比字符串最大长度大1。
处理字符数组时不要忘了在最后加'/0'或者0。
11.擅用三目运算符
int max(int a,int b)
{return a>b?a:b;
}
int gcd(int m,int n)
{return n?gcd(n,m%n):m;
}
int abs(int a)
{return a<0?-a:a;
}
12.将乘法转换成加法减少时间
log(a*b)=log(a)+log(b)
将乘法转换成除法防止溢出
a/(b*c)=a/b/c
13.排序要求不高时可以用C++的STL模板函数sort(),stable_sort()
int a[n]={...};
sort(a,a+n);
bool cmp(int m,int n)
{return m>n;
}
sort(a,a+n,cmp);
14.有的题数据范围小但是计算量大可以用打表法
先把结果算出来保存在数组里,要用时直接取出来。
15.浮点数比较时最好控制精度
#define eps 1e-6
fabs(a-b)<eps
16.有些字符串与整型的转换函数是非标准的
可以使用sscanf()和sprintf()代替
sscanf(s,"%d",&n);//从字符串s中读入整数n
sprintf(s,"%d",n);//将n转换为字符串s
17.
用define定义数组初始化函数
#define MS(a,b) memset(a,b,sizeof(a))
18.
数据类型取值范围
unsigned int 0~42 9496 7295
int -2147483648~21 4748 3647
unsigned long 0~4294967295
long -2147483648~2147483647
long long的最大值:922 3372 0368 5477 5807
long long的最小值:-9223372036854775808
unsigned long long的最大值:184 4674 4073 7095 5161
__int64的最大值:922 3372 0368 5477 5807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:1844 6744 0737 0955 1615
19.
如果A上方无界,我们则说
Sup{A}=+∞
如果A下方无界,则认为
Inf{A}=-∞。
常用Sup表示上确界,用Inf表示下确界。
21.
二进制位移操作。当 x 为1 时,1转为二进制还是 1,向左位移变为10,然后与1 进行二进制或运算就是11,二进制11 其实就是十进制的3。
1 << 1 等于 00000001 << 1等于 00000010等于十进制 2
2 << 1 等于 00000010 << 1等于 00000100等于十进制 4
3 << 1 等于 00000011 << 1等于 00000110等于十进制 6
4 << 1 等于 00000100 << 1等于 00001000等于十进制 8
也不难理解向左移动多位。如向左移 2 位 00001110 << 2。
00001110
------------
00111000
同样 C 语言中还有还有右移运算符>>,表示按二进制位向右移动。
23.
i&(-i)是什么意思?
返回 i 的二进制数最低位为1的权值
例如
10100最低位的1权值是4
1001010最低位的1权值是2
111最低位的1权值是1
因此
#include<iostream>
using namespace std;
int main()
{
int i;
for(i=1; i<=10; i++)
cout<<(i&(-i))<<endl;
return 0;
}
的结果就是
1 2 1 4 1 2 1 8 1 2
24.
大数组定义在main函数中不能执行,将其定义为全局变量就可以执行的原因。
答:定义在函数中时,占用的内存来自栈空间,栈空间是在进程创建时初始化的,有固定的大小,一般为几十KB,所以太大的数组会耗光栈空间。
而全局变量在编译的时候编到数据段的,按需分配,自由增长的,可以非常大,32位的系统中可以大到4GB。
37. scanf("\n%*c%d",&m);
scanf 格式中,如果在%后面、格式字符前面加上一个“*”附加说明符,表示跳过该输入,输入的数据不放入变量中。
而输入的 '\n' 是中和掉输出的\n
也可以换成
getchar();
scanf("%*c%d",&m);
而 *c 表示忽略一位 也可以改成
scanf("%*1d%d",&m);
38.sscanf() - 从一个字符串中读进与指定格式相符的数据。
39.%n与其他格式说明符号不同。%n不向printf传递格式化信息,而是令printf把自己到该点已打出的字符总数放到相应变元指向的整形变量中。因此%n对于的变元必须是整形指针。
对printf调用返回之后,%n对于变元指向的变量中将包含有一个整数值,表示出现%n时已经由该次printf调用输出的字符数。
printf("this%n is a test\n",&count);//调用后count为4,this长度为4
sscanf(str+start,"%d%n",&d,&n); start+=n; n=读进数字的长度
40.用 DESC表示按倒序排序(即:从大到小排序)
用 ACS 表示按正序排序(即:从小到大排序)
41.在C语言中typedef是用来进行类型定义,和define相对应
define是把一个自己起的名字的常量定义为代替它的另一个常量来用
typedef是把一个自己起的名字的类型用已经有的类型代替使用,如:
typedef int LL;
之后如果有LL i ;系统则理解为int i;
又如:
typedef long long LL;
之后如果有
Priority_queue<LL,vector<LL>,greater<LL> >a;
系统则理解为
Priority_queue<long long,vector<long long>,greater<long long> >a;
43.在判断两个浮点数大小时,一定要在一边先减去0.000001,如a<b,一定写成a-0.000001<b才行!
44.For(int i=0;i<8;i++);
For(int j=i;j<8;j++); 循环语句加;代表循环一旦确定了i,就只能往下走,即在i为0的j循环结束后就直接结束了,不会从下面的j循环结束后回来再改变i。一般情况下会有更大范围的while回来改变i,再使用这两个for循环
45. 注释方法
第一种:
我是代码1
// 我是注释1
我是代码2
第二种:
我是代码1
/* 我是注释1
我是注释2
我是注释3
*/
我是代码2
第三种:
我是代码1
#if 0
我是注释1
我是注释2
我是注释3
#endif
我是代码2
组合1:
#if 0
/*
我是注释
*/
#endif
组合2:
/*
//我是注释
*/
46.
最精巧的无穷大常量取值是0x3f3f3f3f.
47.
二维数组初始化为0可以这样写
Int a[8][8]={{0}};两个大括号即可