读入优化&输出优化
Posted ymir-taomee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了读入优化&输出优化相关的知识,希望对你有一定的参考价值。
读入优化:读入优化只是针对整数,由于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 }
以上是关于读入优化&输出优化的主要内容,如果未能解决你的问题,请参考以下文章