位运算符
&(按位与):同位二进制均为1,则为1
|(按位或):同位二进制有1,则为1
^(按位异或):同位二进制不同,则为1
~(取反)
<<(左移):各位二进制向左移动指定位数,高位丢弃,低位补0
>>(右移):各位二进制向右移动指定位数,注意符号位也将随同移动(正数最高位为0,负数最高位为1)。
常用库函数
绝对值:abs(x) 自然数指数:exp(x)
向下取整:floor(x) 向上取整:ceil(x)
自然对数:log(x) 指数:pow(a,b)
平方根:sqrt(x) 随机函数:rand()
格式化输入输出
%s:输入字符串(非空格开始,空格结束,注意字符串变量以'\0'结尾)
%*d:对应输入量不赋值给一个变量
%xd:(x为数字)指定输入所占域宽
%md:输出m位(不足补空格,大于m位按实际长度输出)
%-md:左对齐输出
%0md:位数不足m时补0
说明:
1. 考虑时效(大数据输入输出):使用scanf、printf
2. 考虑格式化:使用scanf、printf
3. 考虑变量的数据类型复杂:使用cin、cout
switch语句
switch(表达式) {
case 常量表达式1:语句序列1;break;
case 常量表达式2:语句序列2;break;
······
default:语句序列n+1;
}
执行过程:
1. 计算switch后面表达式的值M
2. 依次计算每个case后常量表达式的值M1···Mn
3. 依次比较配对。如果均不相等,则有default语句就执行语句序列n+1,否则不执行任何操作(即可以省略整个default部分)
循环结构
【例1.求两个正整数的最大公约数 | 辗转相除法(欧几里德算法)】
原理:m,n,r分别表示被除数、除数、余数,则m和n的最大公约数等于n和r的最大公约数。
r=m%n;
while(r!=0) { //或简写为 while(r)
m=n;
n=r;
r=m%n;
}
【例2.分解质因数】
int i=2;
do {
while(n%i==0) {
cout<<i;
n/=i;
if(n!=1) cout<<"*";
}
i++;
} while(n!=1);
【例3.阶乘之和】
int t=1,s=0;
for(int i=2;i<=n;i++) {
t*=i;
s+=t;
}
cout<<s;
补充:计时函数clock()
使用该函数返回程序目前为止运行的时间
(将其除以常数CLOCKS_PER_SEC后得到的值以“秒”为单位)
printf("Time used=%.2lf\n",(double)clock()/CLOCKS_PER_SEC);
求素数
1. 定义法
2. 优化定义法:判断是否被2~内任意数整除
3. 筛法:
bool a[n+1];
memset(a,1,sizeof(a));
a[1]=false;
for(int i=2;i<=sqrt(n);i++) {
if(a[i]) {
for(int j=2;j<=n/i;j++) a[i*j]=false; //筛掉所有a[i]这个数的倍数
}
for(int i=2;i<=n;i++) {
if(a[i]) cout<<i<<" "; //筛完后仍被标记为true的就是素数
}
补充:函数memset()、函数memcpy()
1. memset(a,1,sizeof(a)):将a数组全部赋值为1。注意int型数组只能赋值为0或1,否则出错。
2. memcpy(b,a,sizeof(类型)*k):从a数组赋值k个元素到b数组。