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}判断题
- 当输入为222时,程序并不会执行第161616行的判断语句。
A. 正确
B. 错误 - 将第161616行中的 “&& gcd(i,k)==1” 删去不会影响程序运行结果。
A. 正确
B. 错误 - 当输入的n≥3n \ge 3n≥3的时候,程序总是输出一个正整数。
A. 正确
B. 错误
单选题
- 将第777行的 “gcd(b,a%b)” 改为 “gcd(a,a%b)” 后,程序可能出现的问题是( )。
A. 输出的答案大于原答案。
B. 输出的答案小于原答案。
C. 程序有可能陷入死循环。
D. 可能发生整型溢出问题。 - 当输入为888的时候,输出为( )。
A. 37
B. 42
C. 35
D. 25 - 调用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,输入nnn,ansansans为计数变量,初值为0。
其下是三重循环,iii从1到nnn,jjj从i+1i+1i+1到nnn,kkk从j+1j+1j+1到nnn,显然这一段进行了枚举算法。枚举对象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、ji、j互质。
枚举确定i,j,ki,j,ki,j,k后,再判断如果i、ji、ji、j互质且j、kj、kj、k互质且i、ki、ki、k互质,即i、j、ki、j、ki、j、k两两互质,那么进行计数,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=2,kkk最小取值为j+1=3j+1=3j+1=3,而第三层for循环进行的条件为k≤nk\le nk≤n,此时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、ki、k互质,如果删掉这一句,则进行计数的条件就不包括i、ki、ki、k互质。
比如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、ji、j互质且j、kj、kj、k互质,该条件为真,会进行计数。如果判断条件包含第16行,为gcd(i, j) == 1 && gcd(j, k) == 1 && gcd(i,k)==1,此时i、ki、ki、k不互质,该条件为假,不会进行计数。因此该叙述错误。
18. 当输入的n≥3n \ge 3n≥3的时候,程序总是输出一个正整数。
A. 正确
B. 错误
正确答案:A(本题官方答案为B,官方答案给错了,应该选A)
当n≥3n\ge 3n≥3时,一定可以枚举到三元组(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、ba、b互质但a>1a>1a>1的情况,如果是原来的gcd函数,求a、ba、ba、b的最大公约数,那么条件gcd(a,b)==1为真。对于修改后的gcd函数,只要a>1a>1a>1,那么gcd(a,b)的值就一定大于1,条件gcd(a,b)==1为假。因此很多原来满足条件可以进行计数的情况,变为不满足条件不进行计数,最终计数的结果可能会小于原答案。选B。
- 当输入为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个数 三元组数量 1 2 3,5,7 3 1 3 4,5,7,8 4 1 4 5,7 2 1 5 6,7,8 3 1 6 7 1 1 7 8 1 2 3 5,7 2 2 5 7 1 3 4 5,7 2 3 5 7,8 2 3 7 8 1 4 5 7 1 5 6 7 1 5 7 8 1
共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。