【笔试刷题训练】day_04

选择题

在这里插入图片描述
C/C++中各种进制的表示方法

二进制:在数字的末尾加b,如101010b
八进制:在数字前面加数字0,如0123
十进制:数字本身,如123
十六进制:数字前面加0x 或者 数字后面加h,如0x123、123h

对应输出格式:

%d:十进制方式输出
%o:八进制方式输出
%x:十六进制方式输出

所以显而易见,题目所给两个数分别是8进制和10进制,十进制123转化为8进制为173,所以选择C

在这里插入图片描述

题目要求把flag的第二个bit位置为0
置位一般使用0和&,复位一般使用1和&
那么与flag运算的数的第二个bit位应该是0,而2的二进制位0000 0010,显然把2按位取反,就满足,除了第二个bit位为0,其他位都是1,与flag做与运算,只会把flag的第2个bit位置为0,其他位保持不变

所以选择A

在这里插入图片描述

const在 * 之后:const修饰的是指针,是一个指针常量,指针不能被改变,指针指向的内容可以改变,如int* const p
const在*之后:const修饰的指针指向的内容,是一个常量指针,指针可以改变,指针指向的内容不可以改变,如const int* p或者int const* p

题目描述为一个指针常量,所以答案选择B

在这里插入图片描述

a的类型是int*
&a的类型是int(*)[5]
在这里插入图片描述
所以,*(a+1)得到的为3,*(p-1)得到的为9,答案选C

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

所以在func中,m指向"morning",m++之后,m指向"afternoon"
而m是char**类型,解引用得到char类型,char类型输出的时候是输出字符串,所以得到 “afternoon”,答案选择A

在这里插入图片描述

x&(x-1)的作用是:消去二进制中最右边的一个1
所以该语句配合count++的作用就是 统计二进制1的个数
9999转化为二进制为:10 0111 0000 11 11 一共8个1 所以选A

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

结构体A:

int: 0 1 2 3
short: 4 5
空6 7
int: 8 9 10 11
char:12
一共13字节,对齐后:16字节

结构体B:

int: 0 1 2 3
short: 4 5
char: 6
空7
int: 8 9 10 11
共12字节,已对齐

所以答案为 C

编程题

1. 计算糖果

👉 题目链接

1. 枚举 + 反向带入验证

#include<iostream>
using namespace std;
int main()
{
    int AsubB,BsubC,AaddB,BaddC;
    cin>>AsubB>>BsubC>>AaddB>>BaddC;
    
    //计算出A B C
    int A = (AsubB + AaddB)/2;
    int B = (BsubC + BaddC)/2;
    int C = (BaddC - BsubC)/2;
    
    //此时算出的A B C 可能是截断之后的数! 
    //所以重新带入计算
    if(AsubB == A - B
      && BsubC == B - C
      && AaddB == A + B
      && BaddC == B + C)
    {
        cout << A <<" "<<B<<" "<<C<<endl;
    }
    else
    {
        cout<<"No"<<endl;
    }
    return 0;
}

2. 两个方法算出的B相同

因为,只有一组A B C 满足条件,如果满足条件,那么两种方法计算出来的B一定相同,否则不相同

#include<iostream>
using namespace std;
int main()
{
    int AsubB,BsubC,AaddB,BaddC;
    cin>>AsubB>>BsubC>>AaddB>>BaddC;
    
    //计算出A B C
    int A = (AsubB + AaddB)/2;
    int B1 = (BsubC + BaddC)/2;
    int B2 = (AaddB - AsubB)/2;
    int C = (BaddC - BsubC)/2;
    
    if(B1 == B2)
    {
         cout << A <<" "<<B1<<" "<<C<<endl;
    }
    else
    {
        cout <<"No"<<endl;
    }
    return 0;
}

2. 进制转换

👉 题目链接

思路很简单

  1. M%N得到余数,放入栈中
  2. M/=N,进入下一次循环,直到M为0
  3. 依次把栈中的字符拼接到结果字符串的后面

注意:

  1. 如果M为0,那么str为空,因为一个循环都不会进入,不需要单独处理
  2. 如果M为负数,该题说明了,如果M为负数,直接在最终结果的前面加一个负号即可!
  3. 如果该题改为ACM代码模式则无法返回,要直接输出结果,要注意,需要单独处理一下M为0的情况,什么都不会输出,但是容易会处理为有一个cout<<endl,这时候有一行空格 所以就无法ac!容易卡在这里! 综合考虑,好习惯是上来就把最特殊情况考虑在内!
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 进制转换
     * @param M int整型 给定整数
     * @param N int整型 转换到的进制
     * @return string字符串
     */
    string solve(int M, int N) {
        // write code here
        stack<char> st;
        string str;
        int flag=1;    //记录M正负
        cin>>M>>N;
        //如果M为负数,先换成整数!
        if(M<0)
        {
             M*=-1;
             flag = -1;
        }
        while(M>0)
        {
            int mod = M%N;
            M/=N;
            char ch;
            if(mod<10)
            {
                ch = mod + '0';
            }
            else
            {
                ch = mod-10+'A';
            }
            //入栈
            st.push(ch);
        }
        
        //如果M为负数,先输出符号
        if(flag==-1)
        {
            str+="-";
        }
        while(!st.empty())
        {
            str += st.top();
            st.pop();
        }
        return str;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

2021狮子歌歌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值