范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

NOIP信奥赛算法之加减算式

  昨天晚上儿子说要考考我,让我做一道题,输入是一行一句只有加减运算的算式,譬如1+5-7,让我写一个程序来计算出结果。
  C++里没有原生支持以字符串形式导入一个表达式,并直接计算出结果的能力,可能有一些第三方的库支持。正常做法,如果表达式里有加减乘除四则运算,还有小括号来强制指定优先级,则先把表达式转换成逆波兰表达式,再计算之。未来我会给出具体解法,难度属于"普及+/提高-"。
  而这一题,只有加减两种运算,那就只能算入门难度了。因为加减运算的优先级相同,都按从左至右的结合律依次两两计算。
  表达式中有数字,有+和-两种运算符,混合在了一起,显然,用string类型来保存整个表达式最方便。
  表达式可能会非常长,譬如下面是一个例子:
  每个数字可能都不止一位,因此,要用一个int类型的变量来逐位提取每个参与运算的数字。
  自从2021年9月后,C++14新特性终于可以用于NOIP了,语法糖(syntactic sugar,是指编程语言中可以更容易表达一个操作的语法,它可以使程序员更加容易去使用这门语言,操作可以变得更加清晰、方便,或者更加符合程序员的编程习惯)又有增加,对于一个字符串,可以用以下方式来遍历字符串s:
  而在这之前,只能用下面的语句来遍历:
  而且这种用法还会触发编译器告警,因为如果i为int类型,i的最大上限值是2,147,483,648,如果字符串的长度超过这个值,多余的部分就无法遍历到,正确的写法如下:
  这种写法更为冗长,好在有了C++14,不用再那么麻烦了。
  除了以上三种之外,还有第四种遍历string的方法,一起来看一下:
  以上这种是采用迭代器iterator遍历string的方法。
  第一种方法最简洁,但是也有缺陷,譬如无法从右往左遍历字符串,也无法在一次循环中同时获得字符串的多个字符。所以其它几种方法也并不能被方法一完全取代。在某些场合还是得使用如上这些看起来比较复杂的遍历方法。
  在循环体内,需要对string中的每一个元素做判断,如果是数字,一种处理方式,否则,就是+或者-,那就是另外一种处理方式。程序结构如下:
  在处理字符串中的数字之前,首先要搞清一件事, 形如"12345"和12345,在计算机内是完全不同的两种值,前者是一串字符串,并不能进行数学运算,只能打印出来。而后者是真实的数字,可进行数学运算。同样,字符"3"和数字3也完全是两码事。在C++里,字符串用双引号括起来,字符用单引号括起来。
  表达式中夹杂着数字和+和-的运算符。我们只能把表达式当作一串字符来处理。因此我们要想个办法,把表达式中的数字字符串,譬如"12345"转变成12345,好让它进行数学运算。
  我用前面的方案一,把表达式字符串s中的每一个字符依次放入字符变量ch里。如果ch连续的得到数字字符,则需要把它们合并成一个int类型的整数,方法是用一个初始值为0的变量,不断的乘以10,再加上这个数字。譬如字符串"123",从左往右,先把1拿出来,放在某个变量num中,然后乘以10再加上2,得到12放入num中,然后把num再乘以10得到120再加上3,就得到了123。
  由于ch虽然看上去是数字,其实本质是一个char类型的字符,要通过减去字符"0",得到一个真正的数字。字符0~9在ASCII表中是连续排列的,如果我们得到或者保存一个字符"3",其实它在计算机内真正的值是十进制的51,是该字符的ASCII码值。显然我们不能用51去直接运算。那怎么让51变成数字3呢?只要让它减去"0"的ASCII码值即可。"0"的ASCII码值为十进制48, "3" - "0" = 51 - 48 = 3。这就完成了从"3"到3的转换。
  因此对于一连串的数字形式的字符,要转成int类型的整数,可用如下的方式:
  接下来,该处理运算符了,如果变量ch遇到一个运算符,该怎么处理?首先,我们可以意识到,遇到运算符就意味着变量num的数字合并工作暂时告一段落,变量num中的数字可以参于运算了,可以用来和上一次运算的结果进行+或者-的运算。那到底是+还是-呢?这可不是由当前的ch中的运算符来决定的,而是由上一次得到的运算符来决定的。因此,要有一个变量,来保存上一次的运算符。给它取个名字叫last_op吧,给其一个初始值+。并用另一个变量ans来保存上一次运算的结果,给一个初始值0。
  试想,当遇到表达式中第一个运算符的时候(无论它是+还是-),num中保存的数字立即就会与初始值为0的ans做+的操作,并把结果保存在ans里。这就是我们想要的结果。等运算完成,last_op的使命完成,我们就可以把当前ch中保存的运算符,放入last_op中,用于下一次的计算。同时,还要把num置为0,因为num的当前计算已经完成,它要变成0,以迎接下一批连续的数字。代码可扩展如下:
  我们快完成了,但这样的程序还是不太正确,试想一下,所有的表达式是以数字结尾的,并非以+或者-结尾。譬如表达式1 - 3 + 5, 最后,有一个数字5,最后不可能是一个+或者一个-。 而我们的任意一次计算,都是在遇到运算符+或者-时,才进行的。那最后那个数字,保存在num里的最后的数字,似乎是没有机会运行的,因为循环已经结束,它将被悲惨的丢弃掉。解决的办法也比较巧妙,当我们通过命令行得到整个表达式,在开始做计算之前,我们人为在表达式最后添加一个运算符,随便添加一个+或者-,都可以。这个运算符不会参于运算,只是为了让它左侧的那个数字,不被丢弃。
  整个程序的完整代码如下:
  这道题在洛谷上有,编号是P2788,感兴趣的同学可以去尝试一下。
  到这里,这题就做完了。儿子看完后大笑着说,"完全没有必要那么麻烦,看我的",然后他给出了如下的代码:
  这段只有11行的代码,利用了C++中cin语句的一个特性,当输入譬如为1+5-3时,如果用一个整数(int)类型的变量通过循环语句连续不断的去接收它,这个变量会先得到1, 再得到+5, 再得到-3,它会把+号和-号当作该数字的符号位,而不是运算符。如果把得到的这些数字加起来, 就有1 + (+5) + (-3)。其实结果与1+5-3并无不同,因此代码就可以简单到爆了。

芙蓉国评论丨中国味的浪漫,总让人流连忘返湖南日报全媒体评论员曹茜茜市中心坐落着极具中国特色的孔子广场遇到中国游客,当地人十有八九会用你好来打招呼越来越多的本地高等学府开设中文专业或课程9月14日至16日,国家主席习近平应四川第二大城市,却常被游客忽略!它是李白的故乡,美食很有名作为旅游大省,四川一直是众多游客心生向往之地。峨眉山九寨沟乐山大佛稻城亚丁,这些大美山河抑或名胜古迹,一定也曾走进过你的心中。2021年国庆假期,四川全省7天时间接待游客6782万1934年,美国一家人从青海循化前往甘肃河州(今临夏)沿途见闻海映光(原名CarterHolton)是一位美国人,1923年至1949年间,他长期生活在中国西北并进行传教工作。在此期间,他曾数次往返于青海循化和甘肃河州之间。1934年初冬,他世界生态第一村尼汝在云南迪庆藏族自治州香格里拉市普达措国家公园景区东北方向,有一个叫尼汝的村落,这里海拔2705米,是怒江澜沧江金沙江三江并流,世界自然遗产和自然奇观标志性提名地之一。尼汝村曾先后被深圳军科整形医院双平面隆胸手术方法及注意事项双平面立体隆胸技术,又称双平面立体隆胸术或双平面立体隆胸,这种隆胸技术拥有与传统隆胸无法比拟的特点,术式以个人身高体形黄金比例最恰当的胸距及乳沟形态制定设计方案,同时在原有的立体平广西首批研学旅行精品路线名单公示根据自治区文化和旅游厅印发关于科学精准做好疫情防控加快旅游业恢复发展若干政策措施的通知要求,推动广西研学旅行健康发展,自治区文化和旅游厅拟推出一批主题鲜明课程精良运行规范的研学旅行澳洲黄金海岸冲浪者天堂海滩黄金海岸(GoldCoast)位于澳大利亚的东部沿海,距离布里斯班大约一个小时的车程。这里有绵延42公里的优质沙滩,其中最著名的就是被誉为冲浪者天堂(SurfersParadise汪峰看到章子怡这张沙滩照会不会崩溃?女明星都有自己的黑历史啊很多上了年龄的人都知道,2007年影坛上爆出了一张章子怡的沙滩照,这让章子怡一下子成了一个国际章。那这张照片到底是怎么一回事呢?请大家用个短短的几分钟看下去就明白了。章子怡人才演技再遭重创,前景堪忧!超级大腕同时失手,深圳龙华队看错人?自1988年世界围棋大赛登场亮相之后,迄今为止能够被称为超级大腕的世界围棋高手,在笔者看来屈指可数,他们应该在世界大赛上至少赢得过五个世冠头衔。如此说来,八冠王柯洁和五冠王朴廷桓都邯郸冀南新区一个来了就不想走的地方喜欢一个地方的理由有很多有时候或许仅仅是因为绿意新区文明在景绿意盎然绿树成荫鸟语花香身处于钢筋水泥的地方之中,我们对绿色有着自然的向往,一处处美景和新区人的生活融为一体,无论你身处甘肃省第十五届运动会举行开幕式嘉峪关市代表团第二个入场9月17日晚,甘肃省第十五届运动会开幕式在兰州奥体中心举行。嘉峪关市体育代表团作为第二个进入开幕式现场的代表团走进奥体中心,由51人组成的方阵步伐整齐气势豪迈,充分展现了嘉峪关体育
五绝七首丨陆彩荣湘西诗忆一hr湘西山水骄,逸兴骋怀飘。姹紫嫣红舞,雨浇苗寨韶。二hr塘火屋中旺,熏蒸肉食翘。小椅团稳坐,村涌脱贫潮。三hr十八洞成群,相邻汇一村。苗家儿女慧,致富脱贫门。四hr矮寨建长桥,看米其林大厨如何制作名菜狮子头,铠甲一号与西门子家电联袂录制狮子头是中国传统的菜肴之一,源于江苏苏州。它是一道以猪肉为主要材料制成的肉丸子菜肴,因为形状像狮子头而得名。狮子头的做法多样,又是中华美食文化中的一道经典菜肴,在国内外享有很高的知它是牛肉的克星炖牛肉加3个,出锅软烂鲜香,没牙也能吃大家好,我是小清。牛肉是常常出现在餐桌上的肉类,牛肉是一种营养价值很高的食品,含有丰富的人体所需的蛋白质维生素和矿物质,同时也可以做成很多美味的菜肴,但是牛肉的肉质比较硬,吃起来不威州牛肉区域公用品牌发布会在石家庄举办长城网冀云客户端讯(记者乔娅)3月23日,由河北省农业农村厅指导邢台市农业农村局支持威县人民政府主办威县农业农村局承办的威州牛肉区域公用品牌发布会在石家庄成功举办。威州牛肉区域公用早春三月,零陵中学校园里被春风染得金黄不是秋日,树叶却纷纷变黄,在春风中簌簌飘零跌落,如同地面覆盖一床灿烂的毯子,一路延展铺开。这几天零陵中学校园里落叶纷飞,遍地金黄,浪漫而梦幻,美得让人心醉。一边是花开争艳,春意盎然历史上的今天东巴基斯坦宣布独立成为孟加拉国1947年,蒙巴顿方案出炉,但我们谈论最多的是印巴分治,其实两国独立的时候,孟加拉邦也被一分为二,东孟加拉归巴基斯坦,西孟加拉属印度。所以说,巴基斯坦曾经是由东巴基斯坦和西巴基斯坦总台在巴基斯坦举办探寻现代化之路共建中巴命运共同体主题论坛近日,中央广播电视总台亚洲非洲地区语言节目中心主办的探寻现代化之路共建中巴命运共同体主题论坛在巴基斯坦首都伊斯兰堡举行,巴基斯坦政要专家学者主流媒体负责人以及杰出青年代表参加了论坛气候变暖让食肉细菌向北迁徙到2100年或有9000万人面临被感染风险科学家们23日发出警告称,气候变化可能导致美国更北处的东海岸水域中食肉细菌增加。感染该细菌将造成近20的死亡率,其中多数死亡病例出现在感染2天内。气候变暖及老年人口增多或成助推剂食我国首次全球高空基准气候站观测试验启动!3月16日7时30分,携带北斗卫星导航探空仪的试验气球在内蒙古锡林浩特高空观测站升空,随后成功获取从地面到35000米高空的垂直廓线数据。这意味着我国首次全球高空基准气候站观测试验各地文旅局长花式宣传家乡,welcometo原来这么多年都用错了最近,文旅局长们又开始卷了,或变装或整活,这些热门玩法无一不展现了当地独有的风土人情山川风貌文化内涵。从幕后到台前,实现流量狂飙,虽然有些局长有种不顾人死活的美感(bushi),但直播预告龙游花海共赏非遗龙江龙舞非遗展演活动线上直播西部百姓资讯202303231700发表于陕西龙江龙舞历史悠久,表演时其借助龙形道具和人体运动来完成各种动作和造型,是一项地域特色鲜明的民间文化艺术。龙江龙舞的道具由草龙板凳龙握杆