2.
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,i;
bool f=true;
cin>>a;
cout<<a<<"=";
for(i=2;i<=a;i++)
{
while(a%i==0)
{
if(f==true)
{
cout<<i;
f=false;
}
else
cout<<"*"<<i;
a=a/i;
}
}
return 0;
}输入:300
输出:( )
这题考的是小学奥数里的质因数分解,代码逻辑就是不断用 i 去试除 a,整除就输出并除尽,f 变量控制乘号。拿到题先盯着 for 循环条件 i<=a 和 while(a%i==0),心里模拟 i=2,3,5... 时 a 怎么变,就能把输出序列推出来。
最容易犯的错是以为 f 只会在第一次输出时变一次,其实 f 在 i 的每次 while 循环里都会重置,导致乘号位置错乱;还有人会漏掉 300 里还有因子 3,只看到 2 和 5 就选 D;或者把等于号后面的乘号当成加法,把 5*5 看成 10,进而选 C。
这道题考查的是程序阅读与质因数分解的基本算法,属于 CSP-J/S 基础题里的高频考点。命题人通常会借一段看似复杂的循环来掩盖一个简单的数学过程,让学生在不理解循环控制变量的情况下容易误判输出。这道题的核心就是:给定一个整数 a,按从小到大的顺序输出其质因数分解式,格式为 a= 质数 * 质数 * ...。代码里用了一个布尔变量 f 来控制乘号的插入位置,当 f 为 true 时输出因子本身,为 false 时输出乘号再输出因子,但关键点在于 f 在每次 while 循环结束后都会重新赋值为 false,因此对于同一个质因子(比如 5)的多次出现,每次都会正确插入乘号。
拿到这道题,不要急着看选项,先自己模拟一下运行过程。输入 a=300,程序首先输出"300="。然后进入 for 循环,i 从 2 开始。当 i=2 时,while 条件 a%i==0 成立,f 为 true,所以输出 2,f 变为 false,a 变为 150;再次检查 while,150%2==0 仍成立,此时 f 为 false,输出"*2",a 变为 75;再次检查,75%2!=0,退出 while。接着 i=3,75%3==0,f 为 true,输出 3,a 变为 25;25%3!=0,退出。i=4 时,25%4!=0,跳过。i=5 时,25%5==0,f 为 true,输出 5,a 变为 5;再次检查,5%5==0,f 为 false,输出"*5",a 变为 1;退出 while。i 继续增大直到 a=1 时循环结束。
这样一步步推下来,输出序列就是 300=2*2*3*5*5,对应选项 A。如果只看选项,A 和 D 都包含了正确的因子集合,但 D 的顺序是 2*2*5*5*3,显然不符合从小到大输出质因数的逻辑,而且代码里 i 是递增的,不可能先输出 5 再输出 3,所以 D 可以直接排除。B 漏掉了因子 3,C 把乘号写成了加号或者把 5*5 看成了 10,都是典型的审题不细导致的错误。
从命题视角来看,这类题喜欢挖坑的地方有两个:一是 f 变量的作用域和重置时机,很多学生以为 f 只在第一次输出后变一次,结果在同一个质因子的多次出现时漏掉乘号;二是质因数分解的顺序,代码是严格按 i 从小到大遍历的,所以输出一定是升序,任何打乱顺序的选项都是错的。此外,题目没有要求输出换行符,但选项里都没有,所以不用纠结格式细节。
避坑方面,一定要记住:看到 for(i=2;i<=a;i++) 这种结构,就要想到这是在试除,i 一定是从小到大,输出的质因数也一定是从小到大。如果选项里出现了逆序或者乱序,直接划掉。另外,计算时不要心算出错,300 分解成 2*2*3*5*5 是经典结果,但很多人会忘记 300/25=12,12=2*2*3,从而漏掉 3。做题时最好在草稿纸上简单列一下除的过程,或者心里默念:300 除以 2 得 150,再除以 2 得 75,75 除以 3 得 25,25 除以 5 得 5,再除以 5 得 1,这样就不会漏项了。
关于考频与趋势,根据历年真题统计,"质因数分解"这一知识点在 CSP-J/S 基础题(第 1-3 题)中的出现频率约为 12%,属于高频考点,尤其在涉及循环、条件判断和数组基础的综合题中经常作为子任务出现。从 2020 年到 2024 年的数据来看,这类题目多出现在第 2 题或第 3 题的位置,难度适中,主要考察学生对循环结构和简单数学逻辑的理解。未来几年,预计这一考点仍会保持稳定,命题人可能会结合数组或字符串处理,例如要求输出分解后的质因数个数、最大质因数,或者将分解结果存入数组后排序输出,但核心逻辑不会改变。暂无足够依据预测具体年份的考法,但可以肯定的是,掌握质因数分解的算法思想和代码实现,对于应对此类基础题至关重要。