快读快写 原理详解
快读快写原理详解[TOC]C++的`cin``cout`和C的`scanf``printf`等IO函数
2023-07-29C++ 的 cin
cout
和 C 的 scanf
printf
等 IO 函数已经够我们是用了,但是它们很慢,尽管 cin
cout
可以取消同步以优化,但还是不够快.
所以我们需要找一种更快的方式来输入输出,以防在 OI 中出现 TLE 的情况,便有了快读快输.
代码快读 read quickly注:它们只能读取整数
(资料图片)
templateinline void rq(T& x) { x = 0; char c; bool sign = 0; while(!isdigit(c = getchar())) if(c == "-") sign = 1; do x = (x << 3) + (x << 1) + (c ^ 48); while(isdigit(c = getchar())); if(sign) x = -x; return;}
快写 write quicklytemplateinline void wq(const T& x) { T t = x; static char _wq_buffer[39]; int bp = -1; if(!t) { putchar("0"); return; } if(t < 0) putchar("-"), t = -t; while(t) { _wq_buffer[++bp] = t % 10 + "0"; t /= 10; } for(int i = bp; i >= 0; i--) putchar(_wq_buffer[i]); return;}
代码解释快读第一部分templateinline void rq(T& x)
template
是一个 C++ 的关键字,在这里它的作用是声明函数模板. 尖括号里的 class T
可以理解为声明一个类型 T
,这里的 class
也可以替换成 typename
,并无两样.
这个 T
是什么类型一般取决于这里的 x
是什么类型. 例如:
int x;rq(x); // T = intlong long y;rq(y); // T = long longchar z;rq(z); // T = char
inline
是 内联,在这里是 内联函数,加上它可能会让程序运行的速度变快,类似于宏展开,但它做出的优化取决于编译器和函数的复杂程度, 有兴趣的可以看这位大佬的博客.
void
在这里的意思是无返回类型函数.
T& x
在这里是 引用传参,在此函数内更改 x
对应传进来的参数也会更改,这里它和指针极为相似:
void swap1(int& a, int& b) { int t = a; a = b; b = t;}void swap2(int* a, int* b) { int t = *a; *a = *b; *b = t;}int main() { int x = 1, y = 2; swap1(x, y); // x = 2, y = 1 swap2(&x, &y); // x = 1, y = 2}
这两个的函数的功能都一样,在汇编层面也一样,只不过 swap1
比 swap2
的写法更简便,更像是 C++ 相对于 C 特有的语法糖.
x = 0;char c;bool sign = 0;
x = 0
,这里一般清零,因为传进来的 x
的值不确定,如果不是 \(0\) 会导致接下来的运算出错,从而导致读入无效. 如果可以保证传进来的 x
等于 \(0\) ,则可以省略这一行.
char c
,这个 c
是读入的字符,一般 IO 都是靠字符,然后再转化为数字等别的类型.
bool sign = 0
,这个 sign
表示 x 的符号,\(0\) 表示 \(x \geq 0\) ,\(1\) 表示 \(x < 0\) . 在这里必须清零,因为这是在函数内,如果不清零,它的值是不确定的,从而导致 x
的正负性受到影响. 如果可以保证读入的数是一个非负整数,则可以省略这一行以及相关的内容.
while(!isdigit(c = getchar())) if(c == "-") sign = 1;
此部分是跳过不是数字的时候并确定 x
的符号.
c = getchar()
是读入一个字符,getchar()
是一个较快的方法,比 cin >> c
和 scanf("%c", &c)
快.
!isdigit(...)
是判断该字符是否是一个非数字. 为什么不用 a < "0" || "9" < a
之类的?因为直接 !isdigit(...)
比这个快,isdigit
内部实现类似于打表,有兴趣的可以看这位大佬的博客.
if(c == "-") sign = 1;
显然是确定符号. 但是这种判断有个缺点,当输入:
ho-mo114514
时,sign = 1
,显然这是不正确的.
如果可以保证一开始读入的就是符号或是有效数字位,或已知输入的格式,则可以删除这个 while
循环并做出相应的更改. (我建议还是不要删,删了之后处理格式会很麻烦)
do x = (x << 3) + (x << 1) + (c ^ 48);while(isdigit(c = getchar()));
此部分是边读边更改 x
.
(x << 3) + (x << 1)
是 x * 10
.
x << 3
表示将 x
的二进制位左移三位,x << 1
同理.
什么是左移、右移?
假设
a
是一个 \(8\) 位的数,并且a = 4
,则a
在二进制下是00000100
.左移三位得00010000
,表示 \(32\) ,也就是 \(4 \times 2^3\)不难得出
a << b
\(=a \times 2^b \space (b \geq 0)\) ,a >> b
\(=a \div 2^b \space (b \geq 0)\) .
则上面的表达式等价于 \(x \times 2^3 + x \times 2^1 = x \times 8 + x \times 2 = x \times 10\) .
c ^ 48
是 c - "0"
,将一个数字字符化为数字.
其中 ^
表示异或,在数学中用 \(\bigoplus\) 表示,有基本的四种基本的运算法则:\(0 \bigoplus 0 = 0\) ,\(0 \bigoplus 1 = 1\) ,\(1 \bigoplus 0 = 1\) ,\(1 \bigoplus 1 = 0\). (同0异1)
\(48\) 在 ASCII 中对应的字符是 0
,二进制是 00110000
if(sign) x = -x;
此部分是添加 x
的符号. 有的可能把 -x
写成 ~(x - 1)
,这都表示取 x
的倒数,在汇编层面都一样,会被编译器优化.
templateinline void wq(const T& x)
此部分与快读的第一步分基本一样,只不过多了个 const
. const
在这里表示 x
在此函数内不可被更改,这样就可以写类似这样的代码 wq(1)
wq(a + b)
.
T t = x;static char _wq_buffer[39];int bp = -1;
因为 x
不可变,所以复制了一份给 t
,下面关于 x
的操作一律用 t
代替.
static
在这里表示静态的,相当于在全局定义 _wq_buffer
. 给 buffer
加 _wq_
这个前缀是为了避免和其他的关键字冲突. \(39\) 是 __uint128_t
的十进制下最大位数( \(2^{127} - 1 = 340282366920938463463374607431768211455\) \(39\) 位),如果需要的话可以开更多位.
bp
是 _wq_buffer
当前的有效位数的位置,这里初始值为 \(-1\) 是为了下面方便计算.
if(!t) { putchar("0"); return;}if(t < 0) putchar("-"), t = -t;
特判一些情况,但是直接 -t
的会导致像 \(-128\) \(-65536\) \(\cdots\) \(-2^{8 \times \text{sizeof(T)}}\) 这样的数会输出乱码.
while(t){ _wq_buffer[++bp] = t % 10 + "0"; t /= 10;}
每次取 t
的个位,然后转化为数字字符倒序存到 _wq_buffer
里,直到 t = 0
.
for(int i = bp; i >= 0; i--) putchar(_wq_buffer[i]);
输出,因为是倒序存,所以要倒着输出.
参考文献函数模板
pathenon. isdigit()极品实现.
恋喵大鲤鱼. C++ inline 函数简介
标签:
快读快写原理详解[TOC]C++的`cin``cout`和C的`scanf``printf`等IO函数
2023-07-29摘要:帕金森病和老年痴呆是老年人中常见的两种神经退行性疾病,二
2023-07-29北京市防汛办提示:据目前气象预报,29日晚至31日,我市有大到暴雨,局
2023-07-29国家卫生健康委:提高母婴设施配置率-在改善母乳喂养支持环境方面,通
2023-07-29天府融媒·四川新闻网(黄成群曾浩洋刘亚宇)7月28日,成都第31届世界
2023-07-29命运方舟这是一款不错的游戏,现在很多网友都在玩,微安卓小编注意到不
2023-07-297月28日,中自科技(688737)融资买入79 86万元,融资偿还102 62万元,
2023-07-29大众网记者孟祥新枣庄报道7月27日,“网络同心文明同行”第三届山东网
2023-07-291、不会。2、种植的头发是后枕部的毛囊,而后枕部毛囊属于不受荷尔蒙、
2023-07-2907月28日,依顿电子被沪股通减持9 79万股,已连续3日被沪股通减持,共
2023-07-29吃了20年的无花果,今天才知道原来无花果也在吃我们,建议了解。哈喽,
2023-07-29生活中大部分的妈妈都会照顾儿子的起居,很多事情许多妈妈会过度关心,
2023-07-29省委十三届三次全会对加快推进新型工业化作出重大部署,强调坚持把发展
2023-07-291、桌面属性颜色质量16中位高级里的适配器列出所有模式800 600增强色16
2023-07-291、霍金传Hawking(2004)导演:菲利普·马丁编剧:彼得·莫法特主演:本尼
2023-07-291、苹果煲汤可以放一些银耳百合白梨冰糖。2、将苹果和银耳百合洗净,苹
2023-07-28直播吧7月28日讯据媒体人所罗门的臣仆报道,同曦男篮已将皮特森的优先
2023-07-28格隆汇7月28日丨康华生物(300841 SZ)公布,公司于2023年7月27日收到股
2023-07-2801:46全媒体记者卜岚实习生龙思言吴一纯长沙有没有江景现房公寓?最好
2023-07-28广东省防汛防旱防风总指挥部决定于7月28日17时结束防风Ⅳ级应急响应
2023-07-28随着一部部优秀的影视作品呈现在观众面前,预示着影视行业的发展和进步
2023-07-28本周焦企焦炭库存29 6万吨,环比减少4 8万吨,降幅14 0%。焦企焦煤库存
2023-07-28《博德之门3》作为今年最受玩家期待的游戏之一,确实有着非常高的关注
2023-07-287月28日,由中华全国总工会主办的匠心筑梦技能报国第二届大国工匠创新
2023-07-28小樱师从木叶三忍中的纲手,习得百豪之术,并且成为了医疗忍者救死扶伤
2023-07-28奥浦迈7月28日披露投资者关系活动记录表显示,公司已经在海外市场布局
2023-07-28邯山区河沙镇镇贺庄村属于邯郸市邯山区东部边缘村,东靠团结西干渠,南
2023-07-28外交部:中俄合作不针对第三方也不受第三方的干扰和胁迫---7月28日,外
2023-07-28近日,自然资源部公布了2023年自然资源科普讲解大赛、科普微视频大赛和
2023-07-28即将登场的这三大怪兽是魔斯拉、拉顿和基多拉,下面分别介绍,其中旧版
2023-07-28“保健品”是毒药?湖北襄城警方破获一起销售假药案---通讯员周胤伍徐
2023-07-287月28日,在74台液压提升机共同发力下,由中铁建设、中铁十一局集团联
2023-07-28无论是甜宠还是江湖,新古装剧都不约而同打出了励志、成长、传统文化、
2023-07-28国际宠物托运公司,宠物托运公司哪家好这个很多人还不知道,现在让我们
2023-07-28和田白玉光灯下显黄是指和田白玉在光线照射下呈现出一种黄色的现象。和
2023-07-28这是日本和韩国最大的危机,又有两个坏消息传来,日本,韩国,美国,李光耀
2023-07-28曾几何时,三五好友只要一坐下,房子都是绕不开的话题。从2016年始,经
2023-07-28周五亚市WTI油价交投于79 40美元关口附近。受乐观的美国经济数据和供应
2023-07-28来源:TechWeb近日,华大九天的可靠性分析工具EmpyreanPolas®获ISO262
2023-07-28据业者估算,台积电2023年CoWoS总产能逾12万片,2024年将冲上24万片。
2023-07-28很多玩家想知道逆水寒游戏中《逆水寒》老兵服南海探秘攻略,本站搜集了
2023-07-28Block粉丝最爱的卡罗(Caro)和金吉·塔哈纳(KingiTahana)在展示了他们的
2023-07-28王佑硕许佳琪的影评初吻在拍摄电视剧《如意芳霏》时献给了王佑硕。王佑
2023-07-28导读1、你那句是正确的,ryuu少了一个u,是发长音的。2、东京喰鬼里的g
2023-07-28全媒体记者陈向革通讯员刘聪超7月27日,卧龙区自然资源局深入北控南阳
2023-07-28原标题:六部门:从严从紧控制现代煤化工产能规模记者27日获悉,国家发
2023-07-281、账号nishishabi。2、密码250941。本文就为大家分享到这里,希望看了
2023-07-28来为大家解答以上的问题。我的世界村民建房子模组,我的世界村民怎么建
2023-07-271905电影网讯近日,恐怖喜剧片《杀人树懒》发布海报,北美定档8月30日
2023-07-27天津北方网讯:日前,教育部公布2022年高等教育国家级教学成果奖,天津
2023-07-27昨晚,在新加坡T2钻石赛第二站的决赛中,女子单打这一场比赛,非常引人
2023-07-27图片侵删哈喽啊,大家晚上好~我来更新啦,抱歉让大家久等了……(>﹏<)
2023-07-27贝壳财经讯(记者许诺)7月26日-27日,2023全国专精特新中小企业大会
2023-07-27晏子的故事20字左右,晏子的故事这个很多人还不知道,现在让我们一起来
2023-07-27让3640万中国人深夜热辣流汗的APP,9年后的今天发生了巨变!,app,健身,
2023-07-27中国银行东明城中支行崔玉梅:不待扬鞭自奋蹄,东明,城中,王丹,山东,崔
2023-07-27关于“循环经济关键技术与装备”重点专项2023年度指南通过首轮评审的项
2023-07-27今天中职招生网给同学们分享2023年天津市具有招生资质中等职业学校名单
2023-07-27project2010横道图教程,project2010激活码这个很多人还不知道,现在让
2023-07-277月12日,同方全球人寿2023年客服节在江苏南京正式拉开帷幕。江苏保险
2023-07-27把生态优势转化为乡村振兴的引擎。近日,国家生态县泰顺又有大动作——
2023-07-27深圳新闻网2023年7月24日讯(记者贺靛婧通讯员方贵梅)无偿献血拯救生
2023-07-27周明阳对于化工行业而言,2023年注定是艰难的一年。在需求走弱和产能过
2023-07-27SNK的《侍魂2》中的角色娜可露露的1 12Q版手办现在正在进行大促销。原
2023-07-27撰文|三三6月19日,趣丸集团再次向港交所递上招股书,一月有余,暂无进
2023-07-277月初,国家税务总局四川省税务局创新推出首批73项税费服务线下“全省
2023-07-27不动产与空间服务:时移势迁行业投资当别开生面
2023-07-27当前,上市公司上半年业绩成为投资者关注的焦点,已有不少上市公司发布
2023-07-27扬州网讯(通讯员残联萱记者邱凌)“和大家一起运动,非常快乐!”7月2
2023-07-27【成都大运会来了】光明日报记者 周洪双 光明日报通讯员 刘飞蜿蜒的
2023-07-27光明日报记者 常河 光明日报通讯员 田超7月18日的理论课结束后,安
2023-07-277月27日,据BWF世界羽联:2023年日本羽毛球公开赛次轮赛况何冰娇21-122
2023-07-27茌平区融媒体中心官方微信号话说茌平地名播 音:周超 魏蕾 乐平
2023-07-121、到不了歌手:范玮琪作曲:张洪量你眼睛会笑弯成一条桥终点却是我永
2023-07-12记者从黑龙江省招生考试院获悉,11日,2023年黑龙江省高考本科提前批院
2023-07-127月11日晚间,禾川科技发布公告称,向不特定对象发行可转债申请获上交
2023-07-127月11日,易方达远见成长混合A最新单位净值为1 1585元,累计净值为1 15
2023-07-12分析了几分钟,接通语音,我说,从奇门盘上看,你们在六月份的时候
2023-07-12据澎湃新闻报道,近日,浙江省教育厅等九部门印发《浙江省青少年学生“
2023-07-1207月11日,斯达半导被沪股通减持万股,已连续5日被沪股通减持,共计万
2023-07-12贵广网络在互动平台表示,公司目前为贵州村BA提供直播信号传输支持,正
2023-07-12金融界7月12日消息日经225指数高开0 2%,报32280 05点;东证指数高开0
2023-07-12线上“云参展”企业突破2000家,展品超1万件,境外参展企业遍及60多个
2023-07-127月11日,博时价值增长混合最新单位净值为1 014元,累计净值为3 559元
2023-07-12小米手环恢复出厂设置别人还能找到吗小米手环堪称智能手环里的毕业款,
2023-07-121、输入“地名”+“交警”百度,选择当地交警的官网,现在官网都提供查
2023-07-117月10日,陈奕迅在中国香港跟数百歌迷聚会。香港歌迷提早为他庆祝生日
2023-07-112023年上半年,我国新能源汽车产销量分别达378 8万辆和374 7万辆。
2023-07-11挖贝网7月11日,诚昊启元(870724)的持续督导主办券商开源证券近日发
2023-07-11实习记者徐畅7月11日,临沂市人民政府新闻办公室召开新闻发布会。记者
2023-07-11在私人数字货币发展的同时,一方面,各国中央银行也纷纷试水主权数字货
2023-07-11日前,特斯拉中国消息,特斯拉Cyberquad玩具车将于7月14日上市,官方售
2023-07-11日前,重庆移通学院艺术传媒学院组织近40名志愿者实践团前往合川区渭沱
2023-07-11中国网7月11日讯为深入贯彻落实党的二十大精神,复制推广各地已形成的
2023-07-11中国日报7月11日电(记者杜娟摄影张威)7月11日上午10点,随着国产最大
2023-07-11文、图 羊城晚报全媒体记者詹翔闵通讯员陈子楷7月10日,一场气氛超“燃
2023-07-11东鹏控股公布2023年半年度业绩预告,归属于上市公司股东的净利润亿元–
2023-07-11据新华社,圣地亚哥消息:联合国拉丁美洲和加勒比经济委员会(拉加经委
2023-07-11新京报贝壳财经讯(记者于梦儿)7月10日,新京报贝壳财经记者从上海市
2023-07-11新华社巴黎7月10日电(记者张百慧)法国政府10日宣布启动“未来网络”
2023-07-11Copyright © 2015-2022 太平洋水产网版权所有 备案号:豫ICP备2022016495号-17 联系邮箱:93 96 74 66 9@qq.com