一,数据类型范围
int 占4B 补码表示的范围为 [-231,231-1] (约为-2*109~2*109这个量级)
大于int 范围考虑使用unsigne int 或 long long //输入输出格式为%lld
常见10^10这个范围的两个数相加减就可能超过int这个范围。
大整数相加时正溢出不可能为0,而负溢出可能为0(10000000000000+10000000000000=0)
二,scanf printf输入输出
- printf 输出字符串的问题
printf属于C语言的范畴,C语言本身是没有string类型的.
char str[]='abc';
printf("%s",str);
这里的str是一个字符数组,也就是说printf 里面应该是一个字符数组名才能正确输出字符串,一直输出到‘\0‘停止。有时输出不正确输出一大堆乱码的时候有可能是对字符数组修改时丢失了’\0‘.
调用C++的string库声明一个字符串数组,采用printf进行输出时一定要在字符串后调用.c_str(),获取字符串的首地址才能正确输出。
string num[10] = {"ling","yi","er","san","si","wu","liu","qi","ba","jiu"};
printf("%s",num[0].c_str());
2.scanf 连续输入字符时的问题
例如在循环中采用scanf读取字符
for(int i=0;i<N;i++){
getchar();//先清除缓冲区,否则循环会中途跳出
scanf("%c %c",&a,&b);
}
scanf读取字符%c是获取一个ASCII码,因此回车(\n)也可能会被读取,不采用getchar();吸收换行符的话循环可能会不正确退出。
3.sacnf("%s",str)的问题
预开设的字符数组务必保证要比存储数据多一个单元用于存放‘\0’。
字符数组间相互用循环赋值时也注意没有用把‘\0’也赋值过去了。
scanf("%s",str);无法读取空字符串,即回车符,如果需要处理空串情况改用cin.getline(str,maxn);
三、数组引用作为参数传递
void shuffle(int order[],string (&card)[54]){
//
}
一定要采用固定大小的数组?
考虑到扩展性可能还是要传递指针。
四、Struct Class
1.如果在其中声明了一个static 成员变量,其初始化要在main()函数之前初始化。
2.如果在结构体或者类中声明了cmp函数,务必标注为静态函数,且调用时要加上作用域
五、小技巧
1.将一个不确定位数的整数依次提取各位数字时,只能从最低位开始。如果需要正序输出处理结果时,可以利用递归的堆栈特性先进后出。
void fun(int n){
if(n/10==0){
printf("%d",n);
return;
}
fun(n/10);
printf("%d",n%10);
}
六、杂
1、for(;表达式A,表达式B;) 逗号相连默认为‘或’的关系。
2.算法笔记中A1065中提到 long long型的A+B必须存到一个long long 变量中才能与long long C比较,直接在if中相加比较会错误,但是实测并没有发生这个问题
3.如果对于固定长的数字串用整型存储,输出时记得要进行补0操作
4.函数参数能用引用就尽量使用引用,否者形参开辟内存并赋值的操作会消耗大量的时间。这一点在大结点的图中的递归函数中尤其严重。
To be continued