洛谷P1957 口算练习题 ---对各个大神题解的深度剖析系列001

引言:先看题目,我再带你去看各个大神的思维方式,和c++里被他们活用的小技巧,万丈高楼,起于微末。

声明:本人对别人题解图片的引用纯属是为借鉴别人算法思路和优化别人的代码行文,并提供更系统介绍,无贬低其他题解创作者的意思,如有冒犯还请见谅,无意触及

1,此系列重点在于借鉴各个大神思路,提供多解思路,所以对于单个解法可能不是过于细致

先看解法一

cin的技巧

先看原作者的解法,我会在此解法一最后解释,你可以先对比原创作者的和我的代码差异于优化:

以上为原创作者代码,我也是新人,确实没想到有这个,之后我沿着原创作者思路,优化后写了自己的解法

 是的,你并没有看错,优化后只需要29行即可解决,不需要用到<sstream>这个高级东西,直接化繁为简,我们总是去学高级的,花里胡哨的东西,但是我认为这并不重要,若能理解本质,那些基础的基本功却能发挥出化腐朽为神奇的作用

关于原作者的思路:重点还是在于

哎呦喂,你在干嘛,我初始也看不懂,但是我要提醒你,clear()不是清空的意思,它不会清空读入到缓冲区的东西

cin.clear() 的作用是重置输入流的状态标志,让因错误而中断的输入流恢复可用。当输入操作失败(例如用户输入了字母,但程序期望数字),输入流会进入错误状态,导致后续所有输入操作被跳过。此时必须用 clear() 重置状态,才能继续读取数据。但是此时他的错误数据被储存在了缓冲区,因为它是在缓冲区存完再识别,缓冲区并未清理干净,所有需要cin.ignore()去专门清理缓冲区


这个内容在我的字符串篇有详解:                   
原文链接:https://blog.csdn.net/2501_90651890/article/details/147595765

if(!(cin>>a))的意思,你需要这么理解,起初,在循环里运行到此处 if 时,它会让你输入整形a,①输入了整形类型,则不满足 if条件,if不再执行if 里面的条件,因为在 if判断的条件里只有 1和0,即是真和假,此时满足,返回的是整形,为真,但是前面有 !( )将假转化成了假,只执行了cin>>a将a里面存入了数据,

②输入了字符型,与整形不符,报错中断,本来返回的是0,即假,但是前面有 !( )将假转化成了真,执行了里面操作,让输出流恢复可用,只是原来的 cin>>a,因为不满足数据类型未成功,所有要在执行代码里面重新输入

法二:

<cstdio>的用法

先看原作者:

这次我并无太多优化

这里讲解一下<cstdio>

① sscanf  是 C/C++ 中的一个标准库函数,全称是 ​String Scan Formatted。它的作用是从一个 ​字符串(而非标准输入)​​ 中按照指定格式提取数据,类似于 scanf,但输入源是字符串。以下是其详细用法:这里是把字符串看作输入过来的内容,要你从前往后读

sscanf(源字符串,格式,接收对象地址) 通过此法可将一个字符串通过格式转化为特定类型,存入指定的对象中

② sprintf  是 C/C++ 标准库中一个重要的格式化输出函数,用于将数据按指定格式写入字符数组中。此时你要从后往前读,从后往前理解

sprintf(接收的字符串,格式,传入对象) ,此时格式里代表的是传入对象的数据类型和格式,将按照格式里的格式传给字符串储存

呜呜,作者是学生没有太多时间继续研究,今天这次先到这里了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值