2020年CSP-J认证 CCF非专业级别软件能力认证第一轮真题--完善程序题

2020 CCF认证第一轮(CSP-J)真题

三、完善程序题

第一题 质因数分解

给出正整数n,请输出将n质因数分解的结果,结果从小 到大输出。

例如:输入n=120程序应该输出2 2 2 3 5,表示120=2 X 2 X 2 X 3 X 5输入保2≤n≤10^9提示: 先以小到大枚举变量i,然后用i不停试除n来寻找所有的质因子。

试补全程序。

cpp 复制代码
#include <cstdio>
using namespace std;
int n, i;
int main() {
  scanf("%d", &n);
  for(i = ①;② <=n;i ++){
    ③{
      printf("%d ", i);
      n = n / i;
    }
  }
  if(④)
    printf("%d ", ⑤);
  return 0;
}

单选题

①处应该填

A. n-1

B. 0

C. 1

D. 2

答案:D

**答案分析:**i是用来枚举遍历的因素,应是从2开始,所以答案D

②处应该填

A. n/i

B. n/(i*i)

C. i*i*i

D. i*i

答案:D

**答案分析:**此处应该是枚举结束条件,也就是枚举的最大值,影视i的平方,所以答案D

③处应该填

A. if(i*i<=n)

B. if(n%i==0)

C. while(i*i<=n)

D. while(n%i==0)

答案:D

**答案分析:**此处应该是逐一分解出n的因子,需要循环处理,而符合因子的条件是取余为0,所以答案D

④处应该填

A. n>1

B. n<=1

C. i+i<=n

D. i<n/i

答案:A

**答案分析:**由于上面for循环结束之后n的值如果存在的画就是最后一个因素,所以需要判断n的值是否存在,也就是是否大于1,如果是这时候n就是最后一个因素,答案A

⑤处应该填

A. 2

B. i

C. n/i

D. n

答案:D

**答案分析:**由于上面for循环结束之后n的值如果存在的画就是最后一个因素,所以需要判断n的值是否存在,也就是是否大于1,如果是这时候n就是最后一个因素,答案D

第二题 最小区间覆盖

给出 n 个区间,第 i 个区间的左右端点是 [ ai , bi ] ;现在要在这些区间中选出若干个,使得区间 [0, m] 被所选区间的并覆盖 (即每一个 0≤i≤m 都在某个所选的区间中 ) ;保证答案存在,求所选区间个数的最小值;

输入第一行包含两个整数 n 和 m ( 1 ≤ n ≤ 5000 , 1 ≤ m ≤ 1 0^9 ) 接下来 n 行,每行两个整数 ai , bi ( 0 ≤ a i , b i ≤ m ) ;

提示使用贪心法解决这个问题;先用O(n^2) 的时间复杂度排序,然后贪心选择这些区间;

试补全程序;

cpp 复制代码
   #include <iostream>
   using namespace std;
   const int MAXN = 5000;
   int n, m;
   struct segment { int a, b; } A[MAXN];

   void sort() // 排序
   {
     for (int i = 0; i < n; i++)
         for (int j = 1; j < n; j++)
             if (①)
             {
               segment t = A[j];
               ②
             }
   }

   int main()
   {
     cin >> n >> m;
     for (int i = 0; i < n; i++)
       cin >> A[i].a >> A[i]・b;
     sort();
     int p = 1;
     for (int i = 1; i < n; i++)
       if (③)
         A[p++] = A[i];
     n = p;
     int ans =0, r = 0;
     int q = 0;
     while (r < m)
     {
       while (④)
         q++;
       ⑤;
       ans++;
     }
     cout << ans << endl;
     return 0;
   }

单选题

①处应该填

A. A[j].b>A[j-1].b

B. A[j].a<A[j-1].a

C. A[j].a>A[j-1].a

D. A[j].b<A[j-1].b

答案:B

**答案分析:**此处是进行排序,从给定的程序可以看出来这是一个从小到大的冒泡排序,所以此处应该是冒泡排序的条件,后一个值小于前一个值,就要进行交换,所以答案B

②处应该填

A. A[j+1]=A[j];A[j]=t;

B. A[j-1]=A[j];A[j]=t;

C. A[j]=A[j+1];A[j+1]=t;

D. A[j]=A[j-1];A[j-1]=t;

答案:D

**答案分析:**此处就是实现冒泡排序的交换,前面已经有程序t=a[j],所以接下来就是:a[j]=a[j-1];a[j-1]=t;,所以答案D

③处应该填

A. A[i].b>A[p-1].b

B. A[i].b<A[i-1].b

C. A[i].b>A[i-1].b

D. A[i].b<A[p-1].b

答案:A

**答案分析:**此处要实现的功能是去除重复项,如果当前区间右端点大于上一个区间右端点,就将其保留;所以答案A

④处应该填

A. q+1<n&&A[q+1].a<=r

B. q+1<n&&A[q+1].b<=r

C. q<n&&A[q].a<=r

D. q<n&&A[q].b<=r

答案:A

**答案分析:**此处是要实现从之前覆盖的面积一直到r所在取值;所以答案A

⑤处应该填

A. r=max(r,A[q+1].b)

B. r=max(r,A[q].b)

C. r=max(r,A[q+1].a)

D. q++

答案:B

**答案分析:**此处是要取到r所在的面积的最大右端点,所以答案B