• 每日刷题-3


    目录

    一、选择题

    二、编程题

    1、计算糖果

    2、进制转换


    一、选择题

    1、

    解析:在C语言中,以0开头的整数常量是八进制的,而不是十进制的。所以,0123的八进制表示相当于83的十进制表示,而123的十进制表示不变。printf函数用%o格式符输出八进制数,所以输出结果是123 173。

    2、

    解析:为在C语言中,按位与运算符&可以用来清除某些位,而按位或运算符|可以用来设置某些位。如果要将flag的第二个bit置0,就需要用flag和一个只有第二个bit为0的数进行按位与运算,这个数就是~2,即2的按位取反。所以,flag&=~2就可以实现这个目的。

    3、

    解析:由题可得,&x[4][4]= Oxf8b82140,&x[4][9]= Oxf8b82145,&x[9][9] = Oxf8b8221c,而x[4][9]和x[9][9]之间刚好相隔了5行,设每行N个元素,Oxf8b8221c - Oxf8b82145 = 5*N,得到N=43。

    &x[7][7] = &x[7][9]- 2,&x[4][9]+3*43- 2,可得到0xf8b82145 + 127为x[7][7]的地址。答案为A。

    4、

    解析:首先,定义了一个静态字符指针数组a,它包含了三个字符串元素:“morning”,“afternoon”,“evening”。然后,定义了一个字符指针的指针p,它指向了a的首地址,也就是第一个元素"morning"的地址。接着,调用了func函数,传入了p作为参数。在func函数中,参数m是一个字符指针的指针,它接收了p的值,也就是a的首地址。然后,对m进行了自增操作,使得m指向了a的下一个元素,也就是第二个元素"afternoon"的地址。最后,输出了m所指向的内容,也就是字符串"afternoon"。

    5、

    解析:这个函数的功能是计算一个整数x的二进制表示中有多少个1。然后,进入一个while循环,只要x不为0,就执行以下操作:

    • 将count加1,表示找到了一个1。
    • 将x与x-1进行按位与运算,并将结果赋给x。这个运算的作用是将x的最低位的1变成0,例如:如果x=1010(二进制),那么x-1=1001(二进制),x&(x-1)=1000(二进制)。
    • 最后,当x变为0时,退出循环,返回count的值,表示x的二进制表示中有多少个1。

    6、

    解析:F2: FO+F1=递归3次,F3: F2+F1=1+3+1 = 5,F4: F3+F2=1+5+3=9

    F5: F4+F3=1+9+5=15,F6: F5+F4=1+15+9=25,F7: F6+F5=1+25+15=41,

    F8: F7+F6=1 +41 +25 = 67

    二、编程题

    1、计算糖果

    题目解析: 这道题目的实质是:判断三元一次方程组是否有解及求解, 这里是小学生都会的问题了。A=(a+c)/2;C=(d-b)/2;B2=(b+d)/2,B1=(c-a)/2;
    如果B1不等B2则表达式无解。

    代码如下:

    1. #include
    2. using namespace std;
    3. int main() {
    4. int a, b, c, d;
    5. cin >> a >> b >> c >> d;
    6. int A = (a + c) / 2;
    7. int C = (d - b) / 2;
    8. int B1 = (c - a) / 2;
    9. int B2 = (b + d) / 2;
    10. if (B1 != B2)
    11. cout << "No";
    12. else
    13. cout << A << " " << B1 << " " << C;
    14. return 0;
    15. }

    2、进制转换

    题目解析:本题思路很简单,首先想清楚原理:N进制数,每个进制位的值分别是X0*N^0,X1*N^1, X2*N^2.....,X0,X1,X2就是这些进制位的值。

    首先定义一个字符串table,用于存储0到F的字符,表示从0到15的数。然后定义一个字符串str,用于存储转换后的结果。接着定义一个布尔变量flag,用于判断输入的数是否为负数。如果是负数,就将flag设为true,并将M取反。如果M为0,就直接将str设为"0"。

    然后进入一个循环,不断地对M进行取余和除法操作,将M除以N得到的余数作为table的下标,找到对应的字符,并将其添加到str的末尾。同时将M更新为M除以N得到的商。当M为0时,退出循环。

    最后判断flag是否为true,如果是,就在str的末尾添加一个负号。然后将str反转,输出结果。这样就完成了10进制转换成任意进制的过程。

    1. #include
    2. #include
    3. #include
    4. using namespace std;
    5. int main() {
    6. int M, N;
    7. string table = "0123456789ABCDEF";
    8. string str = "";
    9. bool flag = false;
    10. while (cin >> M >> N) {
    11. if (M < 0) {
    12. flag = true;
    13. M = -M;
    14. }
    15. if (M == 0)str = "0";
    16. while (M) {
    17. str += table[M % N];
    18. M = M / N;
    19. }
    20. if (flag)str += '-';
    21. reverse(str.begin(), str.end());
    22. }
    23. cout << str << endl;
    24. }

  • 相关阅读:
    nginx配置多个服务域名
    2021 ICPC 昆明 I Mr Main and Windmills(直线与线段的交点)
    为荣誉而战!祝贺Bulk Transfer摄像头调试成功
    Seata学习
    云原生周刊:Linkerd 发布 v2.14 | 2023.9.4
    李峋同款爱心代码!跳动的心,给你爱的人一个惊喜!
    华为机试真题 C++ 实现【批量处理任务】
    气象站:处暑至热未止,从事不同行业的人们应该如何预知天气变化
    深度学习开发流程
    swagger踩坑之请求类不显示具体字段
  • 原文地址:https://blog.csdn.net/weixin_65592314/article/details/132760985