B1002 20 查找
- 读取每一位的数字方法
while(sum)
{
sum += sum % 10;
sum /= 10;
}
char str[5][5]={'ling','yi','er','san','si'};
//虽然每个字符串开辟了五个空间 但是在输出的时候 `cout << str[1];` 只会输出已经初始化的部分
- 给函数传递二维数组 一维数组
- 传递二维数组的第二维必须要写上数字
- 在这个函数里面对数组元素修改,就相当于对原数组进行修改
void func (int a[], int b[][5])
{
//...
}
- 左移运算符 <<
- int 最大值2的31次方-1 (1<<31)-1 【必须加括号:位运算符的优先级小于算数运算符】
- 为了避免相加超过int的范围 一般使用 (1<<30)-1
const int INF = (1<<30)-1; // 1的30次方-1 == 0x3fffffff;
const int INF = 0x3fffffff; // 7个f
%md | 右对齐 可以超过m的长度 |
---|---|
%0md | 右对齐 左边的空位用0填充 |
%.mf | 保留m位小数 (四舍六入五成双) |
-
想要四舍五入【rand(double x)函数】
- 3.40 — 3
- 3.45 — 3
- 3.50 — 4
- 3.55 — 4
-
typedef的功能
- 给复杂的变量名七个简单的别称
struct Student_name; //结构体名 typedef Student_name SN; //给这个结构体起个名称 SN s1; SN s2; //SN当做声明 typedef long long LL; LL a = 12312354234;
-
如果数组大小比较大 (大概10^6级别)需要定义在主函数外面,否则程序会退出。
- 因为函数内部申请的局部变量来自系统栈,允许申请的空间小
- 函数外的曲剧变量存储在静态存储区 允许申请的空间大,所以定义在主函数外面
-
string.h
------>memeset(a,0,sizeof(a));
数组初始化- 建议初学者只使用memset赋值0/-1 因为memset是按字节赋值,即对每个字节赋同样的值,int的四个字节会被赋值为相同的值
- 0的二进制补码全为0
- -1的二进制补码全为1 不容易弄错
- 如果要对数组赋其他的值 例如1 / 2 要使用fill函数
- memset比fill执行速度更快
-
gets() 以\n作为输入结束
- 在输入一个数后按回车 或者scanf完一个整数之后 要先用getchar() 吃掉换行符
-
puts() 输出字符串后 紧跟一个换行符
-
字符数组的存储方式
- sscanf与sprintf
sscanf(str,"%d",&n) | 把str以%d的格式传入int型n | 从左到右 |
---|---|---|
sprintf(str,"%d",n) | 把n以%d的格式写到字符数组str中 | 从右到左 |
- sscanf还支持正则表达式 那么很多字符串的题目都将会迎刃而解
- int *p1,p2;
- 只会给第一个变量定义为指针类型 第二个变量定义为int型
- int *p1, *p2, *p3;
- 三个都定义为了指针类型
int *p;
p+1
是从p所指向的int型变量下一个的int型变量地址int *p;
p++
还支持自增自减
- ==等于运算符
- 浮点运算会有误差
- 通常取a落在[b-eps,b+eps]之间 就表明a==b 而经验表明 eps = 10^(-8)比较合适
const double eps =1e-8; #define Equ(a,b) ((fabs(a-b))<(eps))
- 一般的OJ每秒承受的运算次数大约是10e-7 10e-8
- 对于O(n2)来说 n的规模为1000时还能运行 超过1000就很可能超时
- scanf()返回值为成功读入参数的个数
- 一般在黑色屏幕中是不会读取失败的 只有在到了文件末尾才会失败 返回-1
- C语言中EOF代表-1
- 在黑色框框中按ctrl+Z才能结束任务
while(scanf() != EOF){
//...
}
while(gets(a) != NULL){
//...
}
B1041 15 查找
- VS一般使用scanf_s代替scanf 而PAT编译器仍然使用scanf
- 所以在VS加s,提交的时候不加s 就能通过了
B1004 20 查找
scanf("%s%s%d",stu.name,stu.classes,&stu.score);
//传字符串不用加地址符