问答题 [说明] 函数Printprime(int UpBound)的功能是输出1到UpBound以内的全体素数。 [函数2.1] void PrintPrime(int UpBound) printf("2," ); for(i=3; i<UpBound; i+ =2) { int k = sqrt(i); for(j=3; j<= k;{{U}} (1) {{/U}}) /*检查i是否有3到k以入的奇因数*/ if({{U}} (2) {{/U}}) break; fi({{U}} (3) {{/U}}) printf("%d", i); [函数2.2说明] 递归函数invert(int a[],int k),int k)的功能是将数组a中的前k个元素逆置。 [函数2.2] void invert(int a[ ], int k) { int t; if ({{U}} (4) {{/U}}) { invert({{U}} (5) {{/U}}); t=a[0]; a[0] =a[k-1]; a[k-l]=t; } }
【正确答案】
【答案解析】(1)j+=2 (2)i%j==0 (3)j>k (4)k>1
(5)a+1,k-2
[解析](1)~(3)由于(1)处循环只检查i是否能被3到k以内的奇数所整除,因此循环增量应该是2。并且一旦i被某个3到k以内的奇数整除,那么内层for应当立即终止,此时j<=k。相反的,若内层for循环结束后j>k,则表明i没有3到k以内的奇因数,即i是一素数,应该输出;
(4)由于函数递归的终止条件是k不大于1,于是仅在 k>1时需要继续进行递归;
(5)为了将数组a的前k个元素a[0]、……、a[k-1]置逆,只需先将a[1]、……、a[k-2]这k-2个元素置逆,即调用invert(a+1,k-2),再交换a[0]和a[k-1]的值即可。