【笔试强训】Day 4
创始人
2024-04-14 18:10:51

🌈欢迎来到笔试强训专栏


  • (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort
  • 目前状态:大三非科班啃C++中
  • 🌍博客主页:张小姐的猫~江湖背景
  • 快上车🚘,握好方向盘跟我有一起打天下嘞!
  • 送给自己的一句鸡汤🤔:
  • 🔥真正的大师永远怀着一颗学徒的心
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
  • 🎉🎉欢迎持续关注!
    在这里插入图片描述

请添加图片描述

笔试强训解析

  • 🌈欢迎来到笔试强训专栏
    • 🌈选择题
    • 🌈编程题
      • 1️⃣计算糖果
      • 2️⃣进制转换
  • 📢写在最后

请添加图片描述

🌈选择题

有以下程序

#include
#include
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;elsereturn 2*Fun(n+1);
}

A 2
B 4
C 8
D 16

这个自己套一下就出来结果了,就不说了

答案是D

以下程序的输出结果是:

#include 
using namespace std;
void func(char **m)
{++m;cout<<*m<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 
int cnt = 0;
int fib(int n) 
{cnt++;if (n == 0)return 1;else if (n == 1)return 2;elsereturn 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 
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"<cout<

2️⃣进制转换

题目地址:传送

在这里插入图片描述
解题思路:

  • 首先建立两个字符串s和table分别来存放最后的输出结果、进制的对应各个数字
  • 求得M中的每个数位上的数字(通过%/来实现)
  • M求出的结果放进字符串s中,最后倒置字符串
  • 如果M为负数,注意设flag进行区分处理

在这里插入图片描述

#include 
#include 
#include 
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<

📢写在最后

在这里插入图片描述

相关内容

热门资讯

猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...