快速读入:
cpp
inline int read() {
int x = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') { // 跳过非数字字符
if (ch == '-') f = -1; // 处理负号
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + ch - '0'; // 逐字符转数字
ch = getchar();
}
return x * f;
}
1. inline int read()
inline
:inline
关键字建议编译器将这个函数的内容直接嵌入到调用它的地方,而不是进行常规的函数调用。 这样做可以消除函数调用带来的开销(例如,压栈、出栈等),从而提高执行效率。 编译器可以选择忽略inline
建议。
2. int x = 0, f = 1;
-
int x = 0
:x
用于存储最终读取到的整数值。 初始化为0,因为我们将会逐步构建这个整数。 -
int f = 1
:f
用于记录符号(正或负)。 初始化为1,表示正数。 如果遇到负号,f
将被设置为 -1。
3. char ch = getchar();
char ch = getchar();
: 从标准输入(通常是键盘)读取一个字符,并将其赋值给字符变量ch
。getchar()
是 C 标准库中的一个函数,用于读取单个字符。
4. while (ch < '0' || ch > '9') { ... }
-
while (ch < '0' || ch > '9')
: 这个while
循环用于跳过输入中的所有非数字字符。-
ch < '0'
: 检查ch
是否小于字符 '0'(ASCII码为48)。 这可以检测是否是控制字符、空格、标点符号等。 -
ch > '9'
: 检查ch
是否大于字符 '9'(ASCII码为57)。 这检测ch
是否是字母、符号等。 -
||
(逻辑或): 只要ch
小于 '0' 或大于 '9',整个条件就为真,循环继续执行。
-
-
if (ch == '-') f = -1;
: 如果在非数字字符中遇到了负号 (-
),则将f
设置为 -1,表示读取的数字是负数。 -
ch = getchar();
: 在循环的末尾,再次读取一个字符,以便在下一次循环迭代中进行检查。
5. while (ch >= '0' && ch <= '9') { ... }
-
while (ch >= '0' && ch <= '9')
: 这个while
循环用于读取数字字符,并将其转换为整数值。-
ch >= '0'
: 检查ch
是否大于等于字符 '0'。 -
ch <= '9'
: 检查ch
是否小于等于字符 '9'。 -
&&
(逻辑与): 只有当ch
既大于等于 '0' 又小于等于 '9' 时,整个条件才为真,循环才会执行。
-
cpp
x = x * 10 + ch - '0';
-
这是将字符转换为数字并构建整数的关键步骤。
-
ch - '0'
: 将字符 '0' 到 '9' 转换为对应的整数值 0 到 9。 例如,如果ch
是 '5',那么ch - '0'
的结果就是 5。 这是因为字符在 ASCII 码中有固定的顺序,数字字符是连续的。 -
x * 10
: 将当前已构建的整数x
乘以 10,为新的数字腾出位置。 -
x * 10 + ch - '0'
: 将转换后的数字添加到x
的末尾。
-
-
ch = getchar();
: 在循环的末尾,再次读取一个字符,以便在下一次循环迭代中进行处理。
return x * f;
: 返回最终读取到的整数值。将x
(绝对值)乘以f
(符号),得到带符号的整数。
快速输出:
cpp
inline void write(int x) {
if (x < 0) { // 处理负数
putchar('-');
x = -x;
}
if (x >= 10) write(x / 10); // 递归分解高位
putchar(x % 10 + '0'); // 输出当前位
}
cpp
inline void write(int x)
inline
:inline
关键字建议编译器将这个函数的内容直接嵌入到调用它的地方,而不是进行常规的函数调用。 这可以消除函数调用带来的开销(例如,压栈、出栈等),从而提高执行效率。 编译器可以选择忽略inline
建议。
cpp
if (x < 0) { // 处理负数
putchar('-');
x = -x;
}
-
if (x < 0)
: 这个if
语句用来处理负数的情况。 -
putchar('-');
: 如果x
是负数,则使用putchar()
函数输出一个负号 (-
) 到标准输出。putchar()
是 C 标准库中的函数,用于输出单个字符。 -
x = -x;
: 将x
转换为它的绝对值,以便后续处理可以针对正数进行。
cpp
if (x >= 10) write(x / 10);
-
if (x >= 10)
: 这是一个递归调用,用于处理多位数的整数。 如果x
大于或等于 10,说明它有多位数字。 -
write(x / 10);
: 递归调用write()
函数,并将x
除以 10 的结果作为参数传递给它。 这会将x
的最高位数字"剥离"出来,并递归地输出它。 例如,如果x
是 123,那么x / 10
的结果是 12,所以会先输出 12,再输出 3。这确保了数字是从高位到低位输出的。
cpp
putchar(x % 10 + '0');
-
putchar(x % 10 + '0');
: 这是输出数字的实际步骤。-
x % 10
: 计算x
除以 10 的余数,得到x
的个位数字。 例如,如果x
是 123,那么x % 10
的结果是 3。 -
+ '0'
: 将整数数字(0 到 9)转换为对应的字符表示。 例如,如果x % 10
的结果是 3,那么3 + '0'
的结果就是字符 '3'(ASCII 码为 51)。这是因为字符在 ASCII 码中有固定的顺序,数字字符是连续的。 -
putchar(...)
: 使用putchar()
函数将字符输出到标准输出。
-