2022入门组 CSP-J 初赛模拟试题 (15)

一、单选题(每题 2 分,共 30 分)
第 1 题 cout<<011+11;的计算结果是( )。
第 2 题 在程序中用到的一个常数2e-3在内存中占( )空间。
第 3 题 某同学家里装一条宽带进行上网,运营商的说是200M。他需要下载一个软件的大小是2GB,极限最快大约需要( )秒。
第 4 题 学校机房的一台计算机IP地址为10.20.220.22,子网掩码为255.255.192.0,那么学校机房的网络号是( )
第 5 题 char('A'+' '),当大写字母‘A’的ASCII码和空格的ASCII码之和的结果是字母‘a’的ASCII码。请问空格的ASCII是( )。
第 6 题 排序相关STL中,属于稳定排序的是( ) 。
第 7 题 下列( )不是STL序列式容器。
第 8 题 cin、cout属于下面哪一种? ( )。
第 9 题 同一个小数,用double变量存和用float 变量存相比,下面哪种说明是对的? ( )。
第 10 题 一个程序员在main函数中用malloc( )函数开辟了一个数组空间,请问这个空间是在内存中的( )区域。
第 11 题 希尔排序的平均时间复杂度为( )。
第 12 题 4个人过河,过河所需要的时间分别是1,2,5,10,每次过两人,速度由慢者决定,已过河中的一人回,速度由这个人决定,问过河所需最短时间( )。
第 13 题 康托展开可以求解一个排列的序号,比如:12345序号为0,12354序号为1,按字典序增加编号递增,依次类推。康托展开的公式: $x=a_n(n-1)! + a_{n-1}(n-2)! +... +a_1*0!$ ai表示:从右往左数第i位这个数在所有出现过的数中排第几(序号从0开始)。12345的康托展开值,也就是:0*4!+0*3!+0*2!+0*1!+0*0!=0, 52413该序列展开后的值是( )。
第 14 题 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?————《孙子算经》这是著名的中国剩余定理请问第5个被3,5,7除的时候,余数为2,3,2的数( )。
第 15 题 下面哪位科学家的研究,基本上完成了量子计算机的理论基础。( )。
二、判断题(每题 2 分,共 20 分)
第 16 题
#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表示乘法运算,接着的两个数据x,y表示参加运算的运算数。若下一行为两个数据x,y,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。 数据保证第一个算式有三个数据。完成下面的判断题和选择题: 注:↓ 为回车符
判断题
第 16 题 sscanf与scanf 类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符数组为输入源。( )
第 17 题 第13行scanf("%d\n",&n);改成scanf("%d" ,&n) ;程序运行结果不变。( )
第 18 题 第15行gets(a) ;改成geline(cin,a);程序运行结果不变。( )
第 19 题 第23行put(b);改成cout<
第 20 题 若输入1↓d 64 64↓则输出为( )。
第 21 题 若输入2↓a 64 46 则输出为( )。
第 23 题
#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;
}
判断题
第 23 题 C++语言中,struct默认是public 的,而class默认是private的。( )
第 24 题 第06行memset的作用是对a数组里的所有元素设置为0,因为a数组里的元素是int类型的,所以memset是以4个字节为一组进行设置的。( )
第 25 题 第07行len=1;改成len=0;程序的运行结果不变。( )
第 26 题 去除第14行int i=len;将这句话写入第15行,改成for(int i=len;i>1;i--),程序的运行结果不变。( )
第 27 题 第18行Big_int operator +(const Big_int &x)改成Big_int operator + (Big_int x),程序的运行结果不变。( )
第 28 题 第22行ans.a[i]+=a[i]+x.a[i];改成ans.a[i]=a[i]+x.a[i],程序的运行结果不变。( )
第 29 题 若输入010 ↓ 0090 ↓则输出为( )。
三、编程题(每题 25 分,共 50 分)
第 31 题
#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]、e[i]都是不超过5000的正整数,完成下面的判断题和单选题:
第 31 题 main函数里的m和n变量,与f函数里面的m和n变量,占用内存中的不同空间。( )
第 32 题 输入m为0,此程序可能会死循环或发生运行错误。()
第 33 题 若输入2 2 1 2 3 4则输出为( )。
第 34 题 若输入10 2 1 2 3 4则输出为( )。
第 35 题 若输入10 4 2 1 3 3 4 5 7 9则输出为( )。
第 36 题 (4分)若输入20 10,接下来的输入是1到20,则输出为( )。
第 38 题 (回文平方数)回文数是指从左向右念和从右向左念都一样的数。如12321就是一个典型的回文数。 给定一个进制B(2≤B≤20,由十进制表示),输出所有的大于等于1小于等于300(十进制下)且它的平方用B进制表示时是回文数的数。用A,|...表示1010,1111等。 输入一个单独的整数B(B用十进制表示)。 输出每行两个B进制的符合要求的数字,第二个数是第一个数的平方,且第二个数是回文数。
tinclude<bits/stdc++.h>
using namespace std;
int b,a[10000], aa 10000], cnta, cntaa;
void changeb(int x,int __(1)__,int &cnt) {
	cnt=0;
	while(x>0) a[cnt++]=__(2)__;
}
bool is_pal() {
	for(int i=0,j=__(2)__; i<j; i++,j--)
		if(aa[i]!=aa[j]) return 0;
	return 1;
}
void print (int __(1)__,int __(4)__) {
	for(int i=cnt-1; i>=0; i--)
		if(a[i]>=0 && a[i]<=9) cout<<a[i];
		else cout<<__(5)__;
}
int main() {
	cin>>b;
	for(int i=1; i<=300; i++) {
		changeb(i,a, cnta) ;
		changeb (i*1,aa, cntaa) ;
		if(is_pal()) {
			print(a,cnta) ;
			cout<<' ';
			print(aa, cntaa) ;
			cout<<endl;
		}
	}
	return 0;
}
第 38 题 ⑴处应填( )。
第 39 题 ⑵处应填( )。
第 40 题 ⑶处应填( )。
第 41 题 ⑷处应填( )。
第 42 题 ⑸处应填( )。
第 44 题 (吃奶酪)房间里放着n块奶酪。一只小老鼠要把它们都吃掉,向至少要跑多少距离?老鼠一开始在(0,0)点处。 输入第一行有一个整数,表示奶酪的数量n。 第2行到第(n+1)行,每行两个实数,第(i+1)行的实数分别表示第i块奶酪的横纵坐标x_i,y_i。 输出一行一个实数,表示要跑的最少距离,保留2位小数。 数据规模与约定: 对于全部的测试点,保证1≤n≤15,|x_il,|y_i|≤200,小数点后最多有3位数字。 试补全程序
#include <bits/stdc++.h>
using namespace std;
int n;
double a[16][3];
double dp[__(1)__][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; 1<=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(__(2)__) continue;
			int x=__(4)__;
			for(int j=0; j<=n-1; j++) {
				if(__(3)__) continue;
				dp[s][i]=min(dp[s][i],dp[x][j]+dis(j,i));
			}
		}
	}
	int x=__(5)__;
	ans=dp[x][1];
	for (int i=2; i<n; i++) ans=min(dp[x][i],ans);
	printf("%.2lf",ans);
	return 0;
}
第 44 题 ⑴处应填( )。
第 45 题 ⑵处应填( )。
第 46 题 ⑶处应填( )。
第 47 题 ⑷处应填( )。
第 48 题 ⑸处应填( )。