1.
#include<iostream>
using namespace std;
int main(){
int a,b,c,d;
cin>>a;
b=a/3600;
c=a%3600/60;
d=a%60;
cout<<b<<" "<<c<<" "<<d;
return 0;
}输入:123456
输出:( )
拿到这题别急着敲代码,先在脑子里把输入值123456拆开看:它到底是多少小时、多少分、多少秒?程序里的除法和取模就是干这个的,顺着运算顺序一步步算,答案自然出来。
最容易栽跟头的是把整数除法和取模的优先级搞混,或者没注意到C++里整数相除直接截断小数部分,导致算出的小时数偏大或偏小。还有人会下意识想成浮点运算,把结果四舍五入,结果直接选错。另外,题目只给了一个输入值,但选项里数字组合很多,如果没按步骤算,光凭直觉猜,很容易把34和36搞反,或者把秒数算成26这种低级错误。
这道题考查的是C++基础语法中的整数运算、运算符优先级以及程序模拟执行的能力。核心概念很简单:在C++里,整数除法会直接丢弃小数部分(向下取整),取模运算则是求余数。命题人挖坑的地方往往就在这种看似简单的运算上,比如让你把一个大数拆成小时、分钟、秒,如果你没分清除法和取模的顺序,或者误以为a/3600会先算a/3再算60,那就全错了。
拿到题先想什么?当然是模拟程序执行。输入是123456,程序第一步是cin>>a,所以a=123456。接下来是b=a/3600。这里要注意,123456除以3600,在数学上是34.29333...,但在C++整数运算里,小数部分会被直接扔掉,所以b=34。这一步很多人容易忽略“截断”这个细节,脑子里想的是34.29333,然后四舍五入成34,或者误算成35,结果就偏了。
然后算c=a%3600/60。先算a%3600,就是123456除以3600的余数。34×3600=122400,123456-122400=1056,所以a%3600=1056。接下来1056除以60,1056/60=17.6,整数除法截断后c=17。这里有个常见的坑:有人会先算1056/60再取模,或者把1056误算成1056/60=17.6然后四舍五入成18,结果就错了。
最后算d=a%60。123456除以60,123456/60=2057.6,余数是36,所以d=36。这一步其实可以直接用a%60算,不用管前面的b和c。
把三个结果拼起来:b=34,c=17,d=36,输出就是34 17 36,对应选项C。
避坑指南:循环题里要注意++i和i++的区别,但这道题没有循环,主要是整数除法和取模的优先级和截断行为。很多人会误以为a/3600会先算a/3再算60,或者把a%3600算成1056后,再除以60时忘了截断,直接当成17.6,结果选成18。还有人会把d=a%60算成26,可能是把123456除以60的商算错了,或者把余数算成了26(比如123456-2057×60=123456-123420=36,但有人可能误算成26)。总之,每一步都要严格按整数运算规则来,不能带小数。
考频与趋势:从历年BCSP-X真题来看,这种“看程序写结果”的题型在2024年前几轮中非常高频,尤其是涉及整数除法和取模的题目,几乎每年必考一到两道。这类题目通常出现在单选题的前几题,用来考察学生对C++基础语法的熟悉程度。命题人喜欢用简单的数学运算(如时间拆分、进制转换)来包装,实则考察的是对运算符优先级和整数运算特性的理解。
预测:基于现有数据,未来BCSP-X在“看程序写结果”这一题型上仍会保持高频率,但可能会稍微增加一点复杂度,比如引入浮点数与整数的混合运算,或者在循环中嵌套除法和取模。不过,对于整数除法和取模这种基础考点,短期内不太可能大幅改变其考查方式,毕竟这是C++最核心的语法之一,命题人不会轻易放弃这块阵地。