ACM 介绍

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空间

估计好内存使用量,使用小的数据类型,在部分题目中使用滚动数组法解题


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值