读入优化:读入优化只是针对整数,由于getchar()读字符非常的快,所以采用getchar()来进行读入,下设输入的数为x
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()来输出
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 }
原文:https://www.cnblogs.com/Ymir-TaoMee/p/9457772.html