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