#CSP015. 入门级CSP-J第15套初赛模拟试题

入门级CSP-J第15套初赛模拟试题

一、单项选择题(共15题,每题2分,共计30分)

  1. cout << 011 + 11; 的计算结果是( ) {{ select(1) }}
  • 6
  • 14
  • 20
  • 22
  1. 在程序中用到的一个常数2e-3在内存中占( )空间。 {{ select(2) }}
  • 4B
  • 4b
  • 6B
  • 8B
  1. 某同学家里装一条宽带进行上网,运营商的带宽是200M。他需要下载一个大小为2GB的软件,极限最快大约需要( )秒。 {{ select(3) }}
  • 1
  • 10
  • 100
  • 1000
  1. 学校机房的一台计算机IP地址为10.20.220.222,子网掩码为255.255.192.0,那么学校机房的网络号是( ) {{ select(4) }}
  • 255.255.192.0
  • 10.20.192.0
  • 10.20.220.0
  • 255.255.220.0
  1. 已知大写字母'A'的ASCII码加上空格的ASCII码等于字母'a'的ASCII码。请问空格的ASCII码值是( ) {{ select(5) }}
  • 30
  • 31
  • 32
  • 22
  1. 排序相关STL中,属于稳定排序的是( ) {{ select(6) }}
  • sort()
  • qsort()
  • stable_sort()
  • partial_sort()
  1. 下列( )不是STL序列式容器。 {{ select(7) }}
  • set
  • list
  • vector
  • deque
  1. cincout属于下面哪一种?( ) {{ select(8) }}
  • 结构体
  • 函数
  • 变量
  1. 同一个小数,用double变量存和用float变量存相比,数值大小关系是( ) {{ select(9) }}
  • 相等
  • 不确定
  1. 程序员在main函数中用malloc()函数开辟了一个数组空间,这个空间位于内存的( )区域。 {{ select(10) }}
  • 栈内存
  • 堆内存
  • 全局区(静态区)
  • 都有可能
  1. 希尔排序的平均时间复杂度为( ) {{ select(11) }}
  • O(n^1.25)
  • O(n log n)
  • O(n)
  • O(n^2)
  1. 4个人过河,过河所需时间分别是1、2、5、10。每次最多过两人,速度由慢者决定;已过河的一人返回,速度由返回者决定。过河所需最短时间是( ) {{ select(12) }}
  • 19
  • 18
  • 17
  • 16
  1. 康托展开公式:X = a_n*(n-1)! + a_{n-1}*(n-2)! + ... + a_1*0!a_i表示从右往左数第i位的数在未出现的数中排第几(序号从0开始)。序列52413的康托展开值是( ) {{ select(13) }}
  • 105
  • 106
  • 107
  • 108
  1. 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。第5个满足该条件的数是( ) {{ select(14) }}
  • 233
  • 443
  • 653
  • 758
  1. 下面哪位科学家的研究基本完成了量子计算机的理论基础。( ) {{ select(15) }}
  • 图灵
  • 冯诺依曼
  • 杨振宁
  • 姚期智

二、阅读程序(共计40分;判断题每题1.5分,选择题每题3分,特殊标注除外)

(一)字符串算式处理

#include<bits/stdc++.h>
using namespace std;
int n,x,y;
char op,a[1000],b[1000];
int deal(){
    switch (op){
        case '+':return x+y;
        case '-':return x-y;
        case '*':return x*y;
    }
}
int main(){
    scanf("%d\n",&n);
    while (n--){
        gets(a);
        switch (a[0]){
            case 'a':op='+';sscanf(a+2,"%d %d", &x,&y);break;
            case 'b':op='-';sscanf(a+2,"%d %d",&x,&y);break;
            case 'c':op='*';sscanf(a+2,"%d %d",&x,&y);break;
            default :sscanf(a,"%d %d",&x,&y);
        }
        sprintf (b,"%d%c%d=%d",x,op,y,deal());
        puts(b);
        printf("%d\n",strlen(b));
    }
    return 0;
}

输入一个整数n(1 ≤ n ≤ 50),接下来n行每行表示一个算式。若行首为字母a/b/c,分别表示加、减、乘法,后跟两个运算数;若行首为数字,则沿用上行的运算符,两个数字为运算数。保证第一个算式包含运算符。

判断题 16. sscanfscanf功能类似,后者从标准输入读取数据,前者从指定字符数组中读取数据。( ) {{ select(16) }}

  • 正确
  • 错误
  1. 将第13行scanf("%d\n",&n);改为scanf("%d",&n);,程序运行结果不变。( ) {{ select(17) }}
  • 正确
  • 错误
  1. 将第15行gets(a);改为getline(cin,a);,程序运行结果不变。( ) {{ select(18) }}
  • 正确
  • 错误
  1. 将第23行puts(b);改为cout<<b;,程序运行结果不变。( ) {{ select(19) }}
  • 正确
  • 错误

选择题 20. 若输入行内容为d 64 46,则输出为( ) {{ select(20) }}

  • 64/46=1
  • 64/46=1 7
  • 0 1
  • 运行出错
  1. (4分)若输入2后依次输入a 64 46275 125,输出为( ) {{ select(21) }}
  • 64+46=110 275+125=400
  • 110 400
  • 64+46=110 9 275+125=400 11
  • 0 1 2

(二)高精度加法

#include<bits/stdc++.h>
using namespace std;
struct Big_int{
    int a[1000],len;
    Big_int(){
        memset(a,0, sizeof(a));
        len=1;
    }
    Big_int(string s){
        len=s.size();
        for(int i=len;i>=1;i--) a[i]=s[len-i]-'0';
    }
    void print(){
        int i=len;
        for(;i>1;i--) if(a[i]>0) break;
        for(int j=i;j>=1;j--) cout<<a[j];
    }
    Big_int operator+(const Big_int &x){
        Big_int ans;
        ans.len=(len>x.len? len:x.len);
        for(int i=1;i<=ans.len;i++){
            ans.a[i]+=a[i]+x.a[i];
            ans.a[i+1]+=ans.a[i]/10;
            ans.a[i]%=10;
        }
        if (ans.a[ans.len+1]>0) ans.len++;
        return ans;
    }
};
string s;
int main(){
    cin>>s;
    Big_int a(s);
    cin>>s;
    Big_int b(s);
    Big_int c=a+b;
    c.print();
    return 0;
}

判断题 22. C++语言中,struct默认成员访问权限是public,而class默认是private。( ) {{ select(22) }}

  • 正确
  • 错误
  1. 第6行memset按4字节为单位对int数组逐元素置0。( ) {{ select(23) }}
  • 正确
  • 错误
  1. 将第7行len = 1;改为len = 0;,程序运行结果不变。( ) {{ select(24) }}
  • 正确
  • 错误
  1. 去掉第14行int i=len;,将第15行改为for(int i=len;i>1;i--),程序运行结果不变。( ) {{ select(25) }}
  • 正确
  • 错误
  1. 将第18行参数const Big_int &x改为Big_int x,程序运行结果不变。( ) {{ select(26) }}
  • 正确
  • 错误
  1. 将第22行ans.a[i]+=a[i]+x.a[i];改为ans.a[i]=a[i]+x.a[i];,程序运行结果不变。( ) {{ select(27) }}
  • 正确
  • 错误

单选题 28. 若输入010 0090,输出为( ) {{ select(28) }}

  • 100
  • 0100
  • 00100
  • 运行出错

(三)01背包(递归实现)

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000005;
int n,m;
int w[maxn],c[maxn];
int f(int m,int n){
    if(n==0) return 0;
    int x=f(m,n-1);
    int y=0;
    if(m-w[n]>=0) y=f(m-w[n],n-1)+c[n];
    return max(x,y);
}
int main(){
    cin>>m>>n;
    for(int i=1;i<=n;i++)
        cin>>w[i]>>c[i];
    cout<<f(m,n);
    return 0;
}

输入的n不超过200,m不超过30,w[i]c[i]均为不超过5000的正整数。

判断题 29. main函数中的mnf函数中的mn占用内存中不同的空间。( ) {{ select(29) }}

  • 正确
  • 错误
  1. 输入m=0时,程序可能会死循环或发生运行错误。( ) {{ select(30) }}
  • 正确
  • 错误

单选题 31. 若输入2 2 1 2 3 4,输出为( ) {{ select(31) }}

  • 0
  • 2
  • 6
  • 10
  1. 若输入10 2 1 2 3 4,输出为( ) {{ select(32) }}
  • 0
  • 2
  • 6
  • 10
  1. 若输入10 4 2 1 3 3 5 7 9,输出为( ) {{ select(33) }}
  • 8
  • 10
  • 12
  • 14
  1. (4分)若输入20 10,后续依次输入重量与价值均为1到20的物品,输出为( ) {{ select(34) }}
  • 100
  • 110
  • 20
  • 24

三、完善程序(单选题,每小题3分,共计30分)

(一)回文平方数

给定进制B(2 ≤ B ≤ 20),输出所有1~300(十进制)中,平方在B进制下为回文数的数。大于9的数位用A,B...表示。

#include<bits/stdc++.h>
using namespace std;
int b,a[10000],aa[10000],cnta, cntaa;
void changeb(int x,int ①,int &cnt){
    cnt=0;
    while (x>0) a[cnt++]= ② ;
}
bool is_pal(){
    for(int i=0,j= ③ ;i<j;i++,j--)
        if(aa[i]!=aa[j]) return 0;
    return 1;
}
void print(int ④,int cnt){
    for(int i=cnt-1;i>=0;i--)
        if(a[i]>=0 && a[i]<=9) cout<<a[i];
        else cout<< ⑤ ;
}
int main(){
    cin>>b;
    for(int i=1;i<=300;i++){
        changeb(i,a,cnta);
        changeb(i*i,aa, cntaa);
        if(is_pal()){
            print(a,cnta);
            cout<<" ";
            print(aa, cntaa);
            cout<<endl;
        }
    }
    return 0;
}
  1. ①处应填( ) {{ select(35) }}
  • a
  • *a
  • &a
  • a+1
  1. ②处应填( ) {{ select(36) }}
  • x%b; x/=b
  • x/=b; x%b
  • x/=b
  • x%b
  1. ③处应填( ) {{ select(37) }}
  • cnta
  • cnta-1
  • cntaa-1
  • cntaa
  1. ④处不能填( ) {{ select(38) }}
  • cnt
  • *cnt
  • &cnt
  • const cnt
  1. ⑤处应填( ) {{ select(39) }}
  • a[i]
  • char(a[i])
  • char('A'+a[i])
  • char('A'+a[i]-10)

(二)吃奶酪

老鼠从(0,0)出发,吃完所有n块奶酪的最短距离。n ≤ 15,输出保留2位小数。

#include<bits/stdc++.h>
using namespace std;
int n;
double a[16][3];
double dp[ ① ][16],ans;
double dis (int x,int y){
    return sqrt((a[x][1]-a[y][1])*(a[x][1]-a[y][1])+(a[x][2]-a[y][2])*(a[x][2]-a[y][2]));
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i][1]>>a[i][2];
    n++;
    memset(dp,127, sizeof(dp));
    dp[1][0]=0;
    for(int s=0;s<=(1<<n)-1;s++){
        for(int i=1;i<=n-1;i++){
            if( ② ) continue;
            int x= ④ ;
            for(int j=0;j<=n-1;j++){
                if( ③ ) continue;
                dp[s][i]=min(dp[s][i],dp[x][j]+dis(j,i));
            }
        }
    }
    int x= ⑤ ;
    ans=dp[x][1];
    for(int i=2;i<n;i++) ans=min(dp[x][i],ans);
    printf("%.2lf",ans);
    return 0;
}
  1. ①处应填( ) {{ select(40) }}
  • 3
  • 16
  • 20
  • 1<<16
  1. ②处应填( ) {{ select(41) }}
  • (s&(1<<i))==0
  • (x&(1<<j))==0
  • (s&(1<<i))
  • (x&(1<<j))
  1. ③处应填( ) {{ select(42) }}
  • (s&(1<<i))==0
  • (x&(1<<j))==0
  • (s&(1<<i))
  • (x&(1<<j))
  1. ④处应填( ) {{ select(43) }}
  • s-(1<<i)
  • s
  • (1<<n)-1
  • 1<<n
  1. ⑤处应填( ) {{ select(44) }}
  • s-(1<<i)
  • s
  • (1<<n)-1
  • 1<<n