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

时间:2022-04-13 00:42:16

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

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

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


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

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