C++ 读入优化&输出优化


读入优化:读入优化只是针对整数,由于getchar()读字符非常的快,所以采用getchar()来进行读入,下设输入的数为x

  • 负数处理:
    用一个标志变量f,开始时为1,当读入了'-'时,f变为-1,最后x*=f即可
  • 绝对值部分处理:
    getchar()每次只能读一位,所以每当读了一位s时,x*=10,为s留位置,由于s为字符,需要减去'0'才能转为整数
    即:x=x*10+s-'0'
  • 关于细节:
  • 很多时候有多余的空格或者其它的一些无关字符输入,处理时需要注意排除
  • 代码:
     1 void read(int &x)//'&'表示引用,也就是说x是一个实参,在函数中改变了x的值就意味着在外面x的值也会被改变
     2 {
     3     int f=1;//标记正负
     4     x=0;//归零(这就是潜在bug,有可能传进来时x没有归零)
     5     char s=getchar();//读入第一个字符
     6     while(s<'0'||s>'9')//不是数字字符
     7     {
     8         if(s=='-')//不能直接把f=-1,有可能输入的不是'-'而是其他乱七八糟的东西
     9             f=-1;
    10         s=getchar();//继续读
    11     }
    12     while(s>='0'&&s<='9')//是字符(一旦不是字符就意味着输入结束了)
    13     {
    14         x=x*10+s-'0';
    15         s=getchar();
    16     }
    17     x*=f;//改变正负
    18 }
  • 可以用来装逼的代码:
     1 #define num s-'0'
     2 void read(int &x){
     3     char s;
     4     x=0;
     5     bool flag=0;
     6     while(!isdigit(s=getchar()))
     7         (s=='-')&&(flag=true);
     8     for(x=num;isdigit(s=getchar());x=x*10+num);
     9     (flag)&&(x=-x);
    10 }

     

     这段代码里面,isdigit()是用判读一个字符是否是数字字符的,需要#include<cctype>,&&是短路运算符,所以第一个条件不满足时第二个条件直接跳过了。


 

输出优化:putchar()输出字符很快,所以用putchar()来输出

  • 负数处理:
    如果是负数,直接putchar('-'); x=-x; 即可
  • 绝对值部分处理:
    为了极致的速度,用递归,递归下一位,即x/10,然后,要注意边界,只有当x>9才能继续递归,否则输出x%10,即putchar(x%10+'0'),把int变为char,+'0'即可
  • 代码:
     1 void write(int x)//这里当然不用实参
     2 {
     3     if(x<0)//负数
     4     {
     5         putchar('-');
     6         x=-x;
     7     }
     8     if(x>9)//只要x还是2位数或更多就继续分解
     9         write(x/10);//这里递归完后栈里面x的每一位是倒过来的
    10     putchar(x%10+'0');//输出(要把int型变为char型,加'0'即可)
    11 }

     

posted @ 2018-08-10 22:14  Umine  阅读(354)  评论(0编辑  收藏  举报