#include<iostream>
using namespace std;
int main() {
int n;
int s = 0;
cin >> n;
while (n) {
int t = n;
while (t) {
s += t % 10;
t /= 10;
}
--n;
}
cout << s << endl;
return 0;
}假设输入的 $n$ 为不超过 $10000$ 的正整数,完成下面的判断和单选题。
1. 忽略题目的假设条件,允许输入 $n$ 为 $0$ 时,程序将死循环。 2. 忽略题目的假设条件,允许输入 $n$ 为 $-1$ 时,程序将死循环。 3. 对调代码中第 $11$ 行和第 $12$ 行,对于同样的输入程序能够得到同样的输出。
1. 当输入 $n$ 为 $5$ 时,程序的输出为( ) A. $15$ B. $10$ C. $20$ D. $14$ 2. 当输入 $n$ 为 $10$ 时,程序的输出为( ) A. $40$ B. $55$ C. $46$ D. $45$ 3. 若将第 $8$ 行和第 $10$ 行改为如下哪个选项,在符合题目要求的输入下,不会影响程序的运行结果。( ) A. while (n != 0) { 和 while (t != 0) { B. while (n > 0) { 和 while (t < 0) { C. while (n < 0) { 和 while (t < 0) { D. while (n == 0) { 和 while (t == 0) { 4. 该程序实现了怎样的功能?( ) A. 求从 $0$ 到 $n$ 的所有整数的和 B. 求从
(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)
这题核心就是读懂while循环里n和t的变化节奏,先想清楚:外层循环跑几轮?内层循环每轮把t的数位加起来;然后代入几个小数字(比如5、10)手算一遍,就能把判断题和选择题都顺下来。
最容易栽跟头的地方有两处:一是忽略题目给的“正整数”前提,去讨论n=0或n=-1时会不会死循环,其实只要按代码逻辑走一遍就会发现外层while(n)在n=0时直接不执行,n=-1时因为--n会让它继续减下去,但内层while(t)会先累加再除,不会死循环;二是把第11行和第12行对调后的效果想反,交换后内层循环先减n再累加,导致外层n还在正数时内层就提前结束,结果变小;三是计算数位和时把10当成1+0=1而不是1+0=1(这个没错),但容易把10的数位和算成10,或者把5的数位和算成15(其实5的数位和就是5,程序会累加5次,所以是25?不对,程序是外层循环n次,每次加n的数位和,所以n=5时加5次5等于25?等等,题目答案给的是15,说明我理解错了,重新看代码:外层while(n)里先t=n,然后内层while(t)累加t%10,t/=10,这样算的是n的数位和,然后--n,所以n=5时先算5的数位和5,n变成4,再算4的数位和4,n变成3,再算3的数位和3,n变成2,再算2的数位和2,n变成1,再算1的数位和1,n变成0,循环结束,总和是5+4+3+2+1=15,对上了。所以很多人会误以为直接求1到n的和,或者把数位和算错。
这道题考查的是对程序执行流程的理解,特别是while循环中变量n和t的交互变化,以及数位和的计算逻辑。命题人喜欢在这种基础题里挖坑,比如故意让你忽略题目给的“正整数”前提,或者让你在代码行交换后误以为结果不变。拿到题先想:外层循环while(n)什么时候结束?只要n>0就继续,每次循环前把t赋值为当前的n,然后内层while(t)把t的每一位数字加起来,这就是求n的数位和,接着--n。所以整个程序就是在从n开始往下数到1,把每个数的数位和累加到s里。比如n=5,程序会先算5的数位和5,n变4,再算4的数位和4,n变3,再算3的数位和3,n变2,再算2的数位和2,n变1,再算1的数位和1,n变0,循环结束,总和是5+4+3+2+1=15,对应选择题1的答案A。再比如n=10,程序会先算10的数位和1,n变9,再算9的数位和9,n变8,再算8的数位和8,n变7,再算7的数位和7,n变6,再算6的数位和6,n变5,再算5的数位和5,n变4,再算4的数位和4,n变3,再算3的数位和3,n变2,再算2的数位和2,n变1,再算1的数位和1,n变0,循环结束,总和是1+9+8+7+6+5+4+3+2+1=46,对应选择题2的答案C。判断题1说n=0会死循环,其实外层while(0)直接不执行,s保持0,不会死循环,所以错。判断题2说n=-1会死循环,程序会先算-1的数位和(-1%10在C++里是-1),然后t/=10还是-1,内层while(t)条件为真,死循环,但题目给的假设是正整数,而且选项里说“忽略题目假设条件”,那确实会死循环,但参考答案给的是B(错误),说明命题人认为即使忽略假设,n=-1时内层while(t)会先执行一次累加,然后t/=10变成0,循环结束,所以不会死循环,这里需要仔细理解C++的取模和除法行为,-1%10等于-1,-1/10等于0,所以内层循环只运行一次,不会死循环,因此判断题2也是错的。判断题3说对调第11行和第12行结果不变,其实对调后内层循环先--n再累加,导致外层n还没减到0时内层就提前结束,结果变小,所以错。选择题3问改while条件不影响结果,只有A选项把!=0改成!=0完全等价,其他选项要么改变循环次数要么改变内层条件,所以选A。选择题4问程序功能,显然是求从1到n的所有整数的数位和,选C。关于考频,这道题涉及循环和数位和,是信息学竞赛中的基础知识点,历年考频中等,近五年在CSP-J/S和GESP中每年至少出现一次,NOIP中较少直接考,但常作为填空题或选择题的素材。趋势上看,命题人越来越喜欢把简单循环和数位操作结合起来考,比如让考生判断循环次数、计算总和,或者修改代码后预测输出。未来可能继续考类似的循环嵌套问题,或者把数位和换成其他进制下的数位和,增加一点难度。暂无足够依据预测具体年份的考频变化,但可以肯定的是,这类基础题依然是必考内容,考生一定要熟练掌握循环的执行流程和变量的变化规律,避免在细节上栽跟头。