bool 型:8位,1字节, 范围0~1
(0为假,任何非0值为真)
char 型:8位,1字节, 范围-128~127
int 型:一般32位,4字节,范围21,4748,3648
(大约2*10^9)
long long型:64位,8字节,范围稍大于9x10^18
__int64 型(Win下,VC6) :和long long 一样
在题目中要估计好数据范围,选择合适的数据类型,尤其要注意是否会超过32位整型表示范围!
将double转换成int型时有相应的精度问题:原因是double是二进制表示的,在表示一个数是有可能是用无限小数逼近,而且在运算过程中存在误差
double x-> x-1+0.999999998
x+0.000000002
解决方法:
const double eps = 1e-7;
int t=(int)(x+eps);
同上原因,double类型在比较时也会有误差。
x = 40, y通过计算后为40.00000000001
这时x==y不成立
判断相减abs(x-y)是否小于eps,如果小于则认为相等.
更通用的方法:
int sign(double x)
{
if(abs(x)<eps) return 0;
if(x>0) return 1;
return -1;
}
通过sign函数能得到一个double数是正数负数还是几乎为零。
(sign(x-y)==0) -> x==y
一般来讲,时间效率从低到高排列是:
cin,cout < scanf,printf < gets,puts< getchar,putchar
int a;
cin>>a,cout<<a;
scanf("%d",&a),printf("%d",a);
gets(s),puts(s);
其中s为字符串变量(字符串数组名或字符串指针)
(gets(s)作用与scanf("%s", &s)相似, 但不完全相同;puts(s)作用与printf("%s\n", s)相同)
c=getchar(); putchar(ch)
(char c;ch为一个字符变量或常量)
非格式化输入输出函数(gets,puts)可以由上面讲述的标准格式化输入输出函数代替, 这些函数编译后代码少, 相对占用内存也小, 从而提高了速度, 同时使用也比较方便。
puts()函数用来向标准输出设备(屏幕)写字符串并换行, 其调用格式为: puts(s);
其中s为字符串变量(字符串数组名或字符串指针)。
puts()函数的作用与语printf("%s\n", s)相同。
main()
{
chars[20], *f; /*定义字符串数组和指针变量*/
strcpy(s,"Hello, World!"); /*字符串数组变量赋值*/
f="Thank you"; /*字符串指针变量赋值*/
puts(s);
puts(f);
}
说明:
(1). puts()函数只能输出字符串, 不能输出数值或进行格式变换。
(2). 可以将字符串直接写入puts()函数中。如:
puts("Hello,World");
gets()函数
gets()函数用来从标准输入设备(键盘)读取字符串直到回车结束, 但回车符不属于这个字符串。其调用格式为: gets(s);
其中s为字符串变量(字符串数组名或字符串指针)。
gets(s)函数与scanf("%s",&s)相似, 但不完全相同, 使用scanf("%s", &s)函数输入字符串时存在一个问题, 就是如果输入了空格会认为输入字符串结束,空格后的字符将作为下一个输入项处理, 但gets()函数将接收输入的整个字符串直到回车为止。
main()
{
char s[20], *f;
printf("What's your name?\n");
gets(s); /*等待输入字符串直到回车结束*/
puts(s); /*将输入的字符串输出*/
puts("How old are you?");
gets(f);
puts(f);
}
说明: gets(s)函数中的变量s为一字符串。如果为单个字符,编译连接不会有错误, 但运行后会出现"Null pointerasignmemt"的错误。
putchar()函数
putchar()函数是向标准输出设备输出一个字符, 其调用格式为:putchar(ch);
其中ch为一个字符变量或常量,putchar()函数的作用等同于printf("%c", ch);
getchar()函数
getchar()函数从键盘上读入一个字符, 并将读入的字符回显在显示屏幕上。 getchar()函数等待输入直到按回车才结束, 回车前的所有输入字符都会逐个显示在屏幕上。但只有第一个字符作为函数的返回值。
getchar()函数的调用格式为:getchar();
#include<stdio.h>
int main()
{
char c;
c=getchar(); /*从键盘读入字符直到回车结束*/
putchar(c); /*显示输入的第一个字符*/
getch(); /*等待按任一健*/
return 0;
}
int main()
{
int n;
while( scanf(“%d”,&n)!= EOF )
{
//do something..
}
return 0;
}
while循环将工作到读入结束为止。
小技巧:用scanf(“ %c”)会自动略去空格,tab和回车符.
(在%c前面加入空格)
%[…] 中括号中的字符表示集合:
%[abc] 表示读入所有为a或b或c的字符,直到下一个字符不是为止.
如scanf(“%[abc]”, s);
输入“acbadac”时,s中将读入“acba”,“dac”将留在缓冲区
getchar输入速度快.当碰到数据庞大,时间苛刻时,可以用getchar重写一个快速的数据输入函数.
int getint()
{
int ret=0;
char ch=0;
while(!isdigit(ch)) //isdigit(ch):检查参数ch是否为阿拉伯数字0到9。
ch=getchar();
while(isdigit(ch))
ret=ret*10+(ch-'0'),ch=getchar();
return ret;
}
istringstream可以把字符串变成输入流(和cin差不多)
非常适合单行数据的处理
char s[N] = “123 456 12”;(数字之间存在空格)
istringstream sin(s); // 可自己任意改名(此处为 sin )
while(sin>>t)
{
cout<<t<<endl;
}
输出:
123
456
12
题目: 输入在开头缩减了0的IPv6字符串,形如
a56f:d3:0:0124:01:f19a:1000:00
处理成完整的字符串输出
a56f:00d3:0000:0124:0001:f19a:1000:0000
简单做法 用scanf(“%s”,s) 把原字符串输入, 把所有的:号都换成空格,用istringstream处理s,读入到vector中,再对每个字符串补全输出.
常见错误:
在OJ返回评测结果错误的时候,还一般会附带错误信息
Wrong Anser(WA):
Compile Error
Segment Fault / Runtime Error:
Time Limit Exceeded.
Memory Limit Exceeded
Presentation Error
Output Limit Exceeded
RuntimeError/Segment Fault:
可能的原因:
数组开小了
数组越界(如v[-1], 或大小为3的数组却引用了a[222])
除数为0
递归函数层数太多,或者在函数中开了太多变量或开大数组,造成栈溢出
scanf函数调用时没有对变量取值
Memory Limit Exceeded:
题目条件中会给出内存限制,开的数组太大导致MLE
假设题目给16M内存,
100,0000的int = 4M内存
即最多能开大约400,0000的int空间
估计好内存使用量,使用小的数据类型,在部分题目中使用滚动数组法解题