每日刷题-3

目录

一、选择题

二、编程题

1、计算糖果

2、进制转换


一、选择题

1、

每日刷题-3_第1张图片

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

2、

每日刷题-3_第2张图片

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

3、

每日刷题-3_第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、

每日刷题-3_第4张图片

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

5、

每日刷题-3_第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、

每日刷题-3_第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、计算糖果

每日刷题-3_第7张图片

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

代码如下:

#include
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、进制转换

每日刷题-3_第8张图片

题目解析:本题思路很简单,首先想清楚原理: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进制转换成任意进制的过程。

#include 
#include
#include
using namespace std;

int main() {
    int M, N;
    string table = "0123456789ABCDEF";
    string str = "";
    bool flag = false;

    while (cin >> M >> N) {
        if (M < 0) {
            flag = true;
            M = -M;
        }
        if (M == 0)str = "0";

        while (M) {

            str += table[M % N];
            M = M / N;
        }
        if (flag)str += '-';

        reverse(str.begin(), str.end());
    }
    cout << str << endl;



}

你可能感兴趣的:(笔试题目练习,算法)