2023年CCF非专业级别软件能力认证第一轮CSP_J/入门级
2023
第一轮
2023-09-18 11:30:01
164次
一、单选题
假设有一个链表的节点定义如下:
struct Node { int data; Node* next;};
现在有一个指向链表头部的指针:Node* head。如果想要在链表中插入一个新节点,其成员data的值为42,并使新节点成为链表的第一个节点,下面哪个操作是正确的?( )
| A. Node* newNode = new Node; newNode->data = 42; newNode->next = head; head = newNode; |
B. Node* newNode = new Node; head->data = 42; newNode->next = head; head = newNode; |
| C. Node* newNode = new Node; newNode->data = 42; head->next = newNode; |
D. Node* newNode = new Node; newNode->data = 42; newNode->next = head; |
【知识点】 CCF非专业级别软件能力认证CSP-J/入门级
二、判断题
三、组合题
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int f(string x,string y){
int m=x.size();
int n=y.size();
vector<vector<int>>v(m+1,vector<int>(n+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(x[i-1]==y[j-1]){
v[i][j]=v[i-1][j-1]+1;
}else{
v[i][j]=max(v[i-1][j],v[i][j-1]);
}
}
}
return v[m][n];
}
bool g(string x,string y){
if(x.size() != y.size()){
return false;
}
return f(x+x,y)==y.size();
}
int main(){
string x,y;
cin>>x>>y;
cout<<g(x,y)<<endl;
return 0;
} (1).当输入两个完全相同的字符串时,g函数的返回值总是true( )
| A.正确 | B.错误 |
f函数的返回值小于等于min(n,m)。
| A.正确 | B.错误 |
当输入为“csppsc spsccp”时,输出为:( )
| A. "T" |
B. "F" |
| C. "0" |
D. "1" |
f函数的返回值等于两个输入字符串的最长公共子串的长度。( )
| A.正确 | B.错误 |
当输入为“csp-j p-jcs”时,输出为:( )
| A. "0" |
B. "1" |
| C. "T" |
D. "F" |
将第19行中的“v[m][n]”替换为“v[n][m]”,那么该程序( )
| A. 行为不变 |
B. 只会改变输出 |
| C. 一定非正常退出 |
D. 可能非正常退出 |
【知识点】 CCF非专业级别软件能力认证CSP-J/入门级
(编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int min(int x,int y,int z){
return min(min(x,y),z);
}
int edit_dist_dp(string str1,string str2){
int m=str1.length();
int n=str2.length();
vector<vector<int>> dp(m+1,vector<int>(n+1));
for(int i=0;i<=m;i++){
for(int j=0;j<=n;j++){
if(i==0)
dp[i][j]= ① ;
else if(j==0)
dp[i][j]= ② ;
else if( ③ )
dp[i][j]= ④ ;
else
dp[i][j]=1+min(dp[i][j-1],dp[i-1][j], ⑤ );
}
}
return dp[m][n];
}
int main(){
string str1,str2;
cin>>str1>>str2;
cout<<"Mininum number of operation:"
<<edit_dist_dp(str1,str2)<<endl;
return 0;
}⑤处应填( )
| A. dp[i][j] + 1 |
B. dp[i-1][j-1]+1 |
| C. dp[i-1][j-1] |
D. dp[i][j] |
③处应填( )
| A. str1[i-1]==str2[j-1] |
B. str1[i]==str2[j] |
| C. str1[i-1]!=str2[j-1] |
D. str1[i]!=str2[j] |
①处应填( )
| A. j |
B. i |
| C. m |
D. n |
②处应填( )
| A. j |
B. i |
| C. m |
D. n |
④处应填( )
| A. dp[i-1][j-1]+1 |
B. dp[i-1][j-1] |
| C. dp[i-1][j] |
D. dp[i][j-1] |
【知识点】 CCF非专业级别软件能力认证CSP-J/入门级
(寻找被移除的元素)问题:原有长度为n+1公差为1等升数列,将数列输到程序的数组时移除了一个元素,导致长度为n的开序数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。试补全程序。
#include <iostream>
#include <vector>
using namespace std;
int find_missing(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] == mid + __(1)__ ) {
__(2)__ ;
} else {
__(3)__ ;
}
}
return __(4)__ ;
}
int main() {
int n;
cin >> n;
vector<int> nums(n);
for(int i = 0; i < n; i++)cin >> nums[i];
int missing_number = find_missing(nums);
if (missing_number == __(5)__) {
cout << "Sequence is consecutive" << endl;
} else {
cout << "Missing number is " << missing_number << endl;
}
return 0;
}③处应填( )
| A. left=mid+1 |
B. right=mid-1 |
| C. right=mid |
D. left=mid |
⑤处应填( )
| A. nums[0]+n |
B. nums[0]+n-1 |
| C. nums[0]+n+1 |
D. nums[n-1] |
②处应填( )
| A. left=mid+1 |
B. right=mid-1 |
| C. right=mid |
D. left=mid |
④处应填( )
| A. left+nums[0] |
B. right+nums[0] |
| C. mid+nums[0] |
D. right+1 |
①处应填( )
| A. 1 |
B. nums[0] |
| C. right |
D. left |
【知识点】 CCF非专业级别软件能力认证CSP-J/入门级
#include <iostream>
#include <cmath>
using namespace std;
int solve1(int n){
return n*n;
}
int solve2(int n){
int sum=0;
for(int i=1;i<=sqrt(n);i++){
if(n%i==0){
if(n/i==i){
sum+=i*i;
}else{
sum+=i*i+(n/i)*(n/i);
}
}
}
return sum;
}
int main(){
int n;
cin>>n;
cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;
return 0;
} (1).如果输入的n为质数p的平方,那么solve2(n)的返回值为( )
| A. p2+p+1 |
B. n2+n+1 |
| C. n2+1 |
D. P4+2p2+1 |
如果输入的n为质数,solve2(n)的返回值为n2+1( )
| A.正确 | B.错误 |
当输入为正整数时,第一项减去第二项的差值一定( )
| A. 大于0 |
B. 大于等于0且不一定大于0 |
| C. 小于0 |
D. 小于等于0且不一定小于0 |
如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和( )
| A.正确 | B.错误 |
当输入为“5”时,输出为( )
| A. "651.625" |
B. "650.729" |
| C. "651.676" |
D. "652.625" |
第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次( )
| A.正确 | B.错误 |
【知识点】 CCF非专业级别软件能力认证CSP-J/入门级
#include<iostream>
#include<cmath>
using namespace std;
double f(double a,double b,double c){
double s=(a+b+c)/2;
return sqrt(s*(s-a)*(s-b)*(s-c));
}
int main(){
cout.flags(ios::fixed);
cout.precision(4);
int a,b,c;
cin>>a>>b>>c;
cout<<f(a,b,c)<<endl;
return 0;
}假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题:
(1).程序总是输出四位小数( )
| A.正确 | B.错误 |
将第7行中的"(s-b)*(s-c)"改为"(s-c)*(s-b)"不会影响程序运行的结果( )
| A.正确 | B.错误 |
当输入为“3 4 5”时,输出为( )
| A. "6.0000" |
B. "12.0000" |
| C. "24.0000" |
D. "30.0000" |
当输入为“2 2 2”时,输出为“1.7321”( )
| A.正确 | B.错误 |
当输入为“5 12 13”时,输出为( )
| A. "24.0000" |
B. "30.0000" |
| C. "60.0000" |
D. "120.0000" |
【知识点】 CCF非专业级别软件能力认证CSP-J/入门级
