CSP-J 2025 入门级 第一轮初赛 阅读程序1【题目】01#includealgorithm02#includecstdio03#includecstring04inlineintgcd(inta,intb){05if(b0)06returna;07returngcd(b,a%b);08}09intmain(){10intn;11scanf(%d,n);12intans0;13for(inti1;in;i){14for(intji1;jn;j){15for(intkj1;kn;k){16if(gcd(i,j)1gcd(j,k)117gcd(i,k)1){18ans;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. 37B. 42C. 35D. 25调用gcd(36,42)gcd(36,42)gcd(36,42)会返回 。A. 6B. 252C. 3D. 2【题目难度】D【题目考点】1. 枚举2. 最大公约数【题目解析】04inlineintgcd(inta,intb){05if(b0)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);12intans0;13for(inti1;in;i){14for(intji1;jn;j){15for(intkj1;kn;k){16if(gcd(i,j)1gcd(j,k)117gcd(i,k)1){18ans;19}20}21}22}23printf(%d\n,ans);主函数中先声明nnn输入nnnansansans为计数变量初值为0。其下是三重循环iii从1到nnnjjj从i1i1i1到nnnkkk从j1j1j1到nnn显然这一段进行了枚举算法。枚举对象i,j,ki,j,ki,j,k满足ijkijkijk三个数互不相同。因此该枚举过程为在数值范围[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当n2n2n2时iii取1jjj最小取i12i12i12kkk最小取值为j13j13j13而第三层for循环进行的条件为k≤nk\le nk≤n此时k3,n2,knk3, n2, k nk3,n2,kn因此不会进行第三层循环第16行的判断语句也不会执行该叙述正确。17. 将第161616行中的 “ gcd(i,k)1” 删去不会影响程序运行结果。A. 正确B. 错误正确答案Bgcd(i,k) 1表示要限制i、ki、ki、k互质如果删掉这一句则进行计数的条件就不包括i、ki、ki、k互质。比如i2,j3,k4i2,j3,k4i2,j3,k4如果判断条件为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会不断减小直到b1b1b1时一定有a mod b0a\bmod b0amodb0再进行递归调用时第二个参数b0b0b0进入递归出口返回aaa。因此修改后的gcd(a,b)函数返回的值一定为aaa。该过程不会出现死循环、整型溢出或栈溢出。对于a、ba、ba、b互质但a1a1a1的情况如果是原来的gcd函数求a、ba、ba、b的最大公约数那么条件gcd(a,b)1为真。对于修改后的gcd函数只要a1a1a1那么gcd(a,b)的值就一定大于1条件gcd(a,b)1为假。因此很多原来满足条件可以进行计数的情况变为不满足条件不进行计数最终计数的结果可能会小于原答案。选B。当输入为888的时候输出为 。A. 37B. 42C. 35D. 25正确答案D按照代码执行的算法枚举[1,8][1,8][1,8]中两两互质的三元组。枚举第1个数第2个数必须与第1个数互质第3个数必须与第1、2个数互质。第1个数第2个数第3个数三元组数量123,5,73134,5,7,84145,72156,7,8316711781235,722571345,72357,823781457156715781共25个三元组选D。21. 调用gcd(36,42)gcd(36,42)gcd(36,42)会返回 。A. 6B. 252C. 3D. 2正确答案A手算执行辗转相除法求最大公约数。每次除法的被除数是上一次的除数除数是上一次的余数。当除数为0时被除数为最大公约数。36÷420......3636\div 42 0 ...... 3636÷420......3642÷361......642\div 36 1 ...... 642÷361......636÷66......036\div 6 6 ...... 036÷66......06÷06\div 06÷0最大公约数为6选A。