本文介绍: 2020CCF认证第一轮(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来寻找所有的质因子。试补全程序。

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来寻找所有的质因子。
试补全程序。

#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) 的时间复杂度排序,然后贪心选择这些区间;
试补全程序;

   #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

原文地址:https://blog.csdn.net/frank2102/article/details/135990766

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_65657.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注