CSP-J 2025 入门级 第一轮(初赛) 阅读程序(1)
2026/5/8 16:18:51 网站建设 项目流程

CSP-J 2025 入门级 第一轮(初赛) 阅读程序(1)

【题目】

01#include<algorithm>02#include<cstdio>03#include<cstring>04inlineintgcd(inta,intb){05if(b==0)06returna;07returngcd(b,a%b);08}09intmain(){10intn;11scanf("%d",&n);12intans=0;13for(inti=1;i<=n;++i){14for(intj=i+1;j<=n;++j){15for(intk=j+1;k<=n;++k){16if(gcd(i,j)==1&&gcd(j,k)==117&&gcd(i,k)==1){18++ans;19}20}21}22}23printf("%d\n",ans);24return0;25}

判断题

  1. 当输入为222时,程序并不会执行第161616行的判断语句。
    A. 正确
    B. 错误
  2. 将第161616行中的 “&& gcd(i,k)==1” 删去不会影响程序运行结果。
    A. 正确
    B. 错误
  3. 当输入的n≥3n \ge 3n3的时候,程序总是输出一个正整数。
    A. 正确
    B. 错误

单选题

  1. 将第777行的 “gcd(b,a%b)” 改为 “gcd(a,a%b)” 后,程序可能出现的问题是( )。
    A. 输出的答案大于原答案。
    B. 输出的答案小于原答案。
    C. 程序有可能陷入死循环。
    D. 可能发生整型溢出问题。
  2. 当输入为888的时候,输出为( )。
    A. 37
    B. 42
    C. 35
    D. 25
  3. 调用gcd(36,42)gcd(36,42)gcd(36,42)会返回( )。
    A. 6
    B. 252
    C. 3
    D. 2

【题目难度】:D

【题目考点】

1. 枚举
2. 最大公约数

【题目解析】

04inlineintgcd(inta,intb){05if(b==0)06returna;07returngcd(b,a%b);08}

该函数为根据欧几里得定理gcd(a,b)=gcd(b,a mod b)gcd(a, b) = gcd(b, a\bmod b)gcd(a,b)=gcd(b,amodb)通过递归求最大公约数的函数。
其中函数前的inline为建议编译器将该函数设为内联函数。内联函数在编译后不再是函数,将函数代码复制到调用的地方,没有调用函数的开销。但该函数是递归函数,递归函数不会被内联,所以函数前的inline实际不起作用。

10intn;11scanf("%d",&n);12intans=0;13for(inti=1;i<=n;++i){14for(intj=i+1;j<=n;++j){15for(intk=j+1;k<=n;++k){16if(gcd(i,j)==1&&gcd(j,k)==117&&gcd(i,k)==1){18++ans;19}20}21}22}23printf("%d\n",ans);

主函数中,先声明nnn,输入nnnansansans为计数变量,初值为0。
其下是三重循环,iii从1到nnnjjji+1i+1i+1nnnkkkj+1j+1j+1nnn,显然这一段进行了枚举算法。枚举对象i,j,ki,j,ki,j,k满足i<j<ki<j<ki<j<k,三个数互不相同。因此该枚举过程为在数值范围[1,n][1,n][1,n]中枚举不相同的三个数。
gcd(i,j) == 1表示i、ji、jij互质。
枚举确定i,j,ki,j,ki,j,k后,再判断如果i、ji、jij互质且j、kj、kjk互质且i、ki、kik互质,即i、j、ki、j、kijk两两互质,那么进行计数,ansansans增加1。最后输出ansansans

因此该代码解决的问题为:求在[1,n][1,n][1,n]中选择互不相同的且两两互质的三个整数的方案数。

判断题

16. 当输入为222时,程序并不会执行第161616行的判断语句。
A. 正确
B. 错误

正确答案:A
n=2n=2n=2时,iii取1,jjj最小取i+1=2i+1=2i+1=2kkk最小取值为j+1=3j+1=3j+1=3,而第三层for循环进行的条件为k≤nk\le nkn,此时k=3,n=2,k>nk=3, n=2, k > nk=3,n=2,k>n,因此不会进行第三层循环,第16行的判断语句也不会执行,该叙述正确。

17. 将第161616行中的 “&& gcd(i,k)==1” 删去不会影响程序运行结果。
A. 正确
B. 错误

正确答案:B
gcd(i,k) == 1表示要限制i、ki、kik互质,如果删掉这一句,则进行计数的条件就不包括i、ki、kik互质。
比如i=2,j=3,k=4i=2,j=3,k=4i=2,j=3,k=4,如果判断条件为gcd(i, j) == 1 && gcd(j, k) == 1,此时i、ji、jij互质且j、kj、kjk互质,该条件为真,会进行计数。如果判断条件包含第16行,为gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i,k)==1,此时i、ki、kik不互质,该条件为假,不会进行计数。因此该叙述错误。

18. 当输入的n≥3n \ge 3n3的时候,程序总是输出一个正整数。
A. 正确
B. 错误

正确答案:A(本题官方答案为B,官方答案给错了,应该选A)
n≥3n\ge 3n3时,一定可以枚举到三元组(1,2,3)(1,2,3)(1,2,3),这一组数是两两互质的,计数得到的满足条件的三元组的个数一定大于等于1,是正整数。该题叙述正确。

单选题

19. 将第777行的 “gcd(b,a%b)” 改为 “gcd(a,a%b)” 后,程序可能出现的问题是( )。
A. 输出的答案大于原答案。
B. 输出的答案小于原答案。
C. 程序有可能陷入死循环。
D. 可能发生整型溢出问题。

正确答案:B
改为gcd(a,a%b)后,gcd第一个参数aaa的值在递归调用的过程中一直不变。由于每次递归调用第二个参数bbb的值都会变为aaa除以bbb的余数,一定小于bbb,因此随着递归调用的进行,函数的第二个参数bbb会不断减小,直到b=1b=1b=1时,一定有a mod b=0a\bmod b=0amodb=0,再进行递归调用时第二个参数b=0b=0b=0,进入递归出口,返回aaa。因此修改后的gcd(a,b)函数返回的值一定为aaa。该过程不会出现死循环、整型溢出或栈溢出。
对于a、ba、bab互质但a>1a>1a>1的情况,如果是原来的gcd函数,求a、ba、bab的最大公约数,那么条件gcd(a,b)==1为真。对于修改后的gcd函数,只要a>1a>1a>1,那么gcd(a,b)的值就一定大于1,条件gcd(a,b)==1为假。因此很多原来满足条件可以进行计数的情况,变为不满足条件不进行计数,最终计数的结果可能会小于原答案。选B。

  1. 当输入为888的时候,输出为( )。
    A. 37
    B. 42
    C. 35
    D. 25

正确答案:D
按照代码执行的算法枚举[1,8][1,8][1,8]中两两互质的三元组。
枚举第1个数,第2个数必须与第1个数互质,第3个数必须与第1、2个数互质。

第1个数第2个数第3个数三元组数量
123,5,73
134,5,7,84
145,72
156,7,83
1671
1781
235,72
2571
345,72
357,82
3781
4571
5671
5781

共25个三元组,选D。

21. 调用gcd(36,42)gcd(36,42)gcd(36,42)会返回( )。
A. 6
B. 252
C. 3
D. 2

正确答案:A
手算执行辗转相除法求最大公约数。每次除法的被除数是上一次的除数,除数是上一次的余数。当除数为0时,被除数为最大公约数。
36÷42=0......3636\div 42 = 0 ...... 3636÷42=0......36
42÷36=1......642\div 36 = 1 ...... 642÷36=1......6
36÷6=6......036\div 6= 6 ...... 036÷6=6......0
6÷06\div 06÷0
最大公约数为6,选A。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询