🌈欢迎来到笔试强训专栏
- (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort
- 目前状态:大三非科班啃C++中
- 🌍博客主页:张小姐的猫~江湖背景
- 快上车🚘,握好方向盘跟我有一起打天下嘞!
- 送给自己的一句鸡汤🤔:
- 🔥真正的大师永远怀着一颗学徒的心
- 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
- 🎉🎉欢迎持续关注!
笔试强训解析
- 🌈欢迎来到笔试强训专栏
- 🌈选择题
- 🌈编程题
- 1️⃣计算糖果
- 2️⃣进制转换
- 📢写在最后
🌈选择题
有以下程序
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int m=0123, n=123;
printf("%o %o\n", m, n);
return 0;
}
程序运行后的输出结果是(做错了)
A 0123 0173
B 0123 173
C 123 173
D 173 173
- 首先要区分各种进制的表达格式
%o
是八进制方式输出的- 最后是如何进行进制间的转化:先
%
再/
,直到等于0
答案选
B
以下哪个选项一定可以将flag的第二个bit置0()
A flag&=~2
B flag|=2
C flag^=2
D flag>>=2
- 先来复习一下:按位或(有真为真)、按位与(都真为真)、按位异或 (相同为0,相异为1)
答案选
A
请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变(知道原理还做错了)
A const int const *x = &y;
B int * const x = &y;
C const int *x = &y;
D int const *x = &y;
E const int * const x = &y;
- 还是const的使用,谁在const的后面就是不能改变
- 要求所指向的内存地址不能改变,内存中的值可以被改变:即x不能变,
*x
解引用的值可以改变
答案选
B
以下C语言指令:运行结果是什么?
int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(“%d,%d”,*(a+1),*(p-1));
A 2,1
B 3,1
C 3,9
D 运行时崩溃
- 只有在
&
和sizeof
之后,才表示数组本身,其余都表示首元素的地址 - &a是一个地址,该地址类型为:
int(*)[5]
- 所以&a + 1 ,跨越了一个数组大小,p被强转为(int*),p-1指向9
答案选
C
二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为(没看懂)
A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
- 复杂点的解方程计算
答案选A
根据下面递归函数:调用函数Fun(2),返回值是多少()
int Fun(int n)
{
if(n==5)
return 2;
else
return 2*Fun(n+1);
}
A 2
B 4
C 8
D 16
这个自己套一下就出来结果了,就不说了
答案是
D
以下程序的输出结果是:
#include <iostream>
using namespace std;
void func(char **m)
{
++m;
cout<<*m<<endl;
}
int main()
{
static char *a[]={"morning", "afternoon", "evening"};
char **p;
p=a;
func(p);
return 0;
}
A afternoon
B 字符o的起始地址
C 字符o
D 字符a的起始地址
- 数组名表示数组首元素的地址,只有在&和sizeof之后才表示数组本身,所以这里的
*a
指的是首元素的地址也就是morning的地址 - “morning” —> char* ,所以p必须给成二级指针
++m
也就是偏移一个元素的大小,也就是指向了afternoon
答案选
A
求函数返回值,输入x=9999
int func(int x){
int count=0;
while (x)
{
count++;
x=x&(x-1);//与运算
}
return count;
}
A 8
B 9
C 10
D 12
- 首先我们来看看这个算法是什么来头
- 接下来就算9999的二进制中有多少个1?算呗
答案是
A
#include <stdio.h>
int cnt = 0;
int fib(int n)
{
cnt++;
if (n == 0)
return 1;
else if (n == 1)
return 2;
else
return fib(n - 1) + fib(n - 2);
}
void main() {
fib(8);
printf("%d", cnt);
}
下列程序执行后,输出的结果为()
A 41
B 67
C 109
D 177
- cnt实际统计的是:斐波那契递归的总次数
答案选
B
在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是()
struct A
{
int a;
short b;
int c;
char d;
};
struct B
{
int a;
short b;
char c;
int d;
};
A 16,16
B 13,12
C 16,12
D 11,16
- 又是结构体对齐,老生常谈了
答案选
C
🌈编程题
1️⃣计算糖果
题目地址:传送
解题思路:
- 枚举法: 算出A、B1、B2、C的表达式,若B1==B2即可知道abc的值为真
不多说上代码:
#include <iostream>
using namespace std;
int main() {
int a,b,c,d;//输入的4个整数
cin>>a>>b>>c>>d;
//每个人手里的糖果
int A = (a+c)/2;
int B1 = (b+d)/2;
int B2 = (c-a)/2;
int C = (d-b)/2;
if(B1 != B2)
{
cout<<"No"<<endl;
}
else
{
cout<<A<<" "<<B1<<" "<<C<<endl;
}
}
2️⃣进制转换
题目地址:传送
解题思路:
- 首先建立两个字符串s和table分别来存放最后的输出结果、进制的对应各个数字
- 求得M中的每个数位上的数字(通过
%
和/
来实现) - M求出的结果放进字符串s中,最后倒置字符串
- 如果M为负数,注意设flag进行区分处理
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string s = "",table = "0123456789ABCDEF";
int m, n;
cin>>m>>n;
//注意当m<0的时候
bool flag = false;
if(m < 0)
{
m = -m;
flag = true;
}
//注意当m=0的时候
if(m == 0)
{
s = "0";
}
while(m)
{
s += table[m%n];
m /= n;
}
if(flag == true)
{
s += '-';
}
//逆置字符串 :3 2 1 -
reverse(s.begin(), s.end());
cout<<s<<endl;
}