算法笔记 心得3
1,6种位运算符
>> 右移 a<<x 整数a按二进制位右移x位 (算数移位 左0 右1 正数 原码 负数 补码)
<< 左移 a>>x 整数a按二进制位左移x位
& 位与 a&b 整数a、b按二进制位对齐,按位进行与运算(除了11得1,其余为0)
| 位或 a|b 整数a、b按二进制位对齐,按位进行或运算(除了00得0,其余为1)
^ 位异或 a^b 整数a、b按二进制位对齐,按位进行异或运算(相同为0,不同为1)
~ 位取反 ~a 整数a的二进制的每一位进行0变1、或1变0操作
2,条件运算符
( ? : )
格式:A?B:C;
条件A为真,返回B的结果,条件A为假,返回C的结果;
宏定义 定义MAX(a,b)
#define MAX(a,b) ((a)>(b)?(a):(b))
3,赋值表达式
赋值运算符可以通过将其他运算符放在前面实现赋值运算的简化
eg. n+=1 等价于n=n+1
n/=(m+1) 等价于n=n/(m+1)
赋值符合运算可以加快编译速度,提高代码可读性
4,输入
scanf函数:
格式:scanf(“格式控制”,变量地址);
eg. scanf(“&d”,&n);
& 取地址运算符
数据类型 格式符 eg
int %d scanf(“%d”,&n);
long long %lld scanf(“%lld”,&n);
float %f scanf(“%f”,&fl);
double %lf scanf(“%lf”,&db);
char %c scanf(“%f”,&c);
字符串(char数组) %s scarf(“%s”,str);
数组名称本身就代表了这个数组的第一个元素的地址,所以不用再加取地址运算符
在scanf中除了char数组整个的输入输出情况不加&,其他变量类型都需要加&
scanf的双引号就是整个输入,只不过不数据换成对应的格式符,并把变量的地址按次序写在后面而已。
除%c以外,scanf对其他格式符(如%d)的输入都是以空白符(即空格,Tab)为结束标志判断标志的
字符数组%s,读入的时候,以空格或换行为读入结束的标志
scanf的%c可以读入空格跟换行的,
要输入两个入”3 4”隔开的字符,两个%d中间可以不加空格
5,输出
格式:printf(“格式控制”,变量名称);
数据类型 格式
int %d
long long %lld
float %f
double %f
char %c
字符串(char数组) %s
实用的输出格式:
%md 可以使不足m位的int型变量,以m位进行有对齐输出,其中高位用空格补齐;如果本身超过m位则保持原样
%0md 区别与上面的是不足m位时,在前面补足够数量的0,而不是空格
%.mf 让浮点数保留m位小数输出。
6,使用getchar、putchar输入输出字符
用来输入输出单个字符,
eg,a=getchar();
getchar 可以识别和储存换行符
7,int main(int argc, char const *argv[]) 表示用命令行处理参数
Int main() 表示不打算用命令行处理参数,可以完全省略
argc是命令行传递到程序中的参数个数
一个字符串数组(字符指针),表示命令行上提供的各个参数
argv [0]中的第一个条目是程序名称,其余的是参数名称,因此程序至少有一个参数,最小值argc为1
8,注释
1)使用/**/
注释/* */之间的内容
2)使用//
注释一行中,该符号后的内容
9,typedef
给复杂的数据类型取别名
Eg. typedef long long LL;
10,常用math函数
fabs(double x)
对double型变量x取绝对值
floor(double x)
对double型变量x向下取整
ceil(double x)
对double型变量x向上取整
pow(double r, double p)
用于返回r^p,要求r、p都是整数
sqrt(double x)
用于返回double型变量额算数平方根
log(double x)
用于返回double型变量以自然数为底的对数
C语言中,没有对任意底数求对数的函数,必须使用换底公示 logab=logeb/longea
pi定义为精确值acos(-1.0) (因为cos(pi)=-1)
const double pi=acos(-1.0);
round(double x)
将double类型变量四舍五入
10,选择结构 if语句
if(A){
}else if(B){
}else{
}
先判断条件A,再判断条件B,如果都不成立执行else的内容
如果if的条件是"!=0”,可以省略”!=0”
eg,if(n)就等价于if(n!=0)
如果if的条件是”==0”,则省略”==“,并在表达式前面添加非运算符”!”
Eg,if(!n)就表示if(n==0)
11,switch
在条件比较多的情况下,会显得比较精练
格式:
switch(表达式){
case 常量表达式1:
…
break;
case 常量表达式2:
…
break;
case 常量表达式n:
…
beak;
default:
...
}
beark的作用在于结束当前的switch语句
12,while语句
while(A){
...
}
do{
...
}while(A)
先执行省略号中的内容一次,再来判断条件A是否成立
13,for语句
for(表达式A;表达式B;表达式c){
….
}
a,在for循环开始前,首先执行表达式A
b,判断表达式B是否成立:若成立,执行省略号的内容;否则退出循环
c,在表达式执行完毕后,执行表达式C,然后返回b
注意⚠️:c语言中不允许在A中,定义变量,如(int i的写法是不允许的)
for(循环初始条件;循环条件;循环变量改变){
...
}
for语句下如果只有一个语句块,可以不加大括号
14,break continue
continue 结束循环的当前轮回,然后进入下一个轮回