读入优化:读入优化只是针对整数,由于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'即可)
}