【C++笔试强训】第四天

选择题

image-20230324205642882

解析:本题考查printf的输出。%o表示是以八进制的形式输出,没有#输出的数值前面就不会有0。m本身就表示八进制;n转化成八进制就是n除以8取余,结果就是173。%x是以十六进制的方式输出。

image-20230326164845698

image-20230324205654962

解析:本题查看位操作符。~表示按位取反;|表示按位或;&表示按位与;^表示按位异或;>>是右移操作符。2的第二个bit一定为1,按位取反之后第二个bit为0,此时再&flag,则flag的第二个bit无论是1还是0,遇见0都会变为0。

image-20230324205704497

解析:题目中要求的就是声明一个指针常量,要求const修饰的是指针本身,所以符合要求的就是B。

image-20230324205714712

解析:数组名表示数组首元素的地址,&数组名则表示取的是整个数组的地址。*(a+1)a+1表示的就是数组中下标为1的元素的地址,*(a+1)可以表示为a[1]即数组中第2个元素;&a+1表示的是数组中最后一个元素后的地址,p-1表示的就是数组中最后一个元素的地址,*(p+1)就是数组最后一个元素9。

image-20230324205727339

解析:本题考查的是二维数组元素之间的位置关系。image-20230326173701008

image-20230324205737640

解析:本题考查递归。

image-20230326174409287

image-20230324205751035

解析:数组a为字符指针数组,数组中元素均为指针,指向的是字符串首元素的地址。char **p表明指针p是一个二级指针,指针指向的类型是char*,p=a表明p指针指向a数组的首元素的地址。传参传p表明m也指向字符指针数组a中首元素的地址,++m表示m向后移动一个指针大小,此时m指向的就是字符指针数组a中第二个元素的地址,解引用得到的就是afternoon

image-20230326180149305

image-20230324205801902

解析:这题只需要知道9999的二进制中有多少个1即可。

我们随便假设n = 9,n = 9的时候有2个1,所以count = 2。9999转化为二进制是10011100001111。所以选A。

image-20230326192133193

image-20230324205817827

解析:需要自己认真的画图计算一下。

image-20230326212551193

image-20230324205856746

解析:结构体内存对齐,默认对齐数为4字节。

编程题

1.计算糖果

image-20230324210343854

解析:假设A - B = a 、B - C = b 、A + B = c 、B + C = d 。这道题目的实质是:判断三元一次方程组是否有解及求
解,得到A=(a+c)/2、C=(d-b)/2、B2=(b+d)/2、B1=(c-a)/2;如果B1不等B2则表达式无解。

这里需要注意计算出来的A和C值是固定的,也就是只通过a,b,c,d计算得到的A和C的值是固定的,B的值可能不相同,所以重点是要判断由a,b,c,d计算得到的B是否相同。

#include <iostream>
using namespace std;
int main()
{
    int a,b,c,d;
    cin >> a >> b >> c >> d;
    int A = (a + c) / 2;
    int C = (d - b) / 2;
    int B1 = (c - a) / 2;
    int B2 = (b + d) / 2;
    if(B1 != B2)
        cout << "No";
    else
        cout << A << " " << B1 << " " << C;
    return 0;
}

2.进制转换

image-20230326193733818

答案解析:本题思路很简单,首先想清楚原理:N进制数,每个进制位的值分别是X0N0,X1*N1, X2N^2…,X0,X1,X2就是这些进制位的值,就是进行取模余数就是当前低进制的位的值是多少,通过除掉进制数,进入下一个进制位的计算。

本人理解:先设立一个表table,里面存放0~F,其下标对应相应的进制转换之后的数。

image-20230326201030044

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main() {
    string s1;
    string table = "0123456789ABCDEF";
    bool flag = false; // 当为负数的时候改为true
    int M = 0;
    int N = 0;
    cin >> M >> N;
    if(M < 0)
    {
        M = 0 - M;
        flag = true;
    }
    while(M)
    {
        s1 += table[M%N];
        M /= N;
    }
    if(flag)
    {
        s1 += '-';
    }
    reverse(s1.begin(),s1.end());
    if(s1.empty())
        cout << "0";
    else       
        cout << s1;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

不 良

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

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

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

打赏作者

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

抵扣说明:

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

余额充值