【笔试强训】Day 4

🌈欢迎来到笔试强训专栏


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

请添加图片描述

请添加图片描述

🌈选择题

有以下程序

#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

在这里插入图片描述

答案选C

以下哪个选项一定可以将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;
}

📢写在最后

在这里插入图片描述

  • 67
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 91
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 91
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小姐的猫(考研停更)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值