【笔试题】【day4】

发布于:2022-10-14 ⋅ 阅读:(326) ⋅ 点赞:(0)

目录

第一题(进制打印)

第二题(二维数组的地址问题)

第三题(二维字符串的相关打印问题)

第四题(x&(x-1)的意思)

第五题(递归)


第一题(进制打印)

有以下程序

#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

二进制的表示格式 101010b,b一定要在最后!!

八进制的表示格式 01234567,以0开头!

十进制的表示格式 123456789,没有任何前缀和后缀

十六进制的表示格式 0x123或者123h都可以表示16进制

%d:表名数据是以十进制方式输出

%o:八进制方式输出

%x:十六进制方式输出

所以我们代码中的m本身就是一个八进制数据,是不需要将0输出的,直接将123打印出来

然后我们的n是123,没有任何前缀和后缀,就是一个十进制数,要以八进制打印,就是将123转换成八进制173. 

第二题(二维数组的地址问题)

二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。 

A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0

不知道总共有多少航,每行有多少列

假设:数组X的起始地址为start,总共有M行,N列

&x[4][4]=start+4*N+4=0xf8b82140

&x[9][9]=start+9*N+9=0xf8b8221c

&x[7][7]=start+7*N+7

我们可以按照上面的二元一次方程组进行运算

&x[4][4]=0xf8b82140

&x[4][9]=0xf8b82145

&x[9][9]=0xf8b8221c

而x[4][9]和x[9][9]刚好相隔了5行

0xf8b8221c-0xf8b82145=5*N

21c-145=D7也就是215十进制,也就是5行中一共有D7个元素,也就是每一行有43个元素

而我们的x[7][7]比x[4][4]多了3*N+3,也就是3*43+3=132,转换成16进制就是84

也就是0xf8b82140加上84就是f8b821c4

第三题(二维字符串的相关打印问题)

 以下程序的输出结果是:

#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的起始地址

上面的p是一个二级指针,一开始指向a的首元素的地址。

(数组名一般表示数组首元素的地址,只有在&和sizeof之后才表示数组本身!,也就是指针+1会越过整一个数组的地址空间)

也就是**p一开始指向a的首元素的地址"morning",

(morning本身就是一个char*,然后我们要获取这个morning的地址,我们的p就必须是一个二级指针)

然后进入函数调用,让++m,也就是让我们的指针偏移一个元素类型的大小,(a数组中,每一个位置都是一个字符串的地址),所以++之后,就从morning的地址跳转到了afternoon的地址,然后对地址进行解引用,就将afternoon这个内容打印了出来

 A

第四题(x&(x-1)的意思)

求函数返回值,输入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

假设x=7--->111

第一次循环:count++--->count:1 x=7&6=111&110=110 x=6

第二次循环:count++--->count:2 x=6&5=110&101=100 x=4

第三次循环:count++--->count:3 x=4&3=100&011=0

一共三次循环

也就是x&(x-1)所代表的是x中的二进制中有多少个1

9的二进制是:1001

9999的二进制是10011100001111,一共8个1,所以选A

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

fib(0)=1

fib(1)=1

fib(2)=fib(0)+fib(1)+1=1+1+1=3

(这里注意,因为在进入fib的时候本身就有cnt++所以fib(2)本身也要++一次,所以计算的时候还要额外+1)

fib(3)=fib(1)+fib(2)+1=1+3+1=5

fib(4)=fib(2)+fib(3)+1=3+5+1=9

fib(5)=fib(3)+fib(4)+1=5+9+1=15

fib(6)=fib(4)+fib(5)+1=9+15+1=25

fib(7)=fib(5)+fib(6)+1=15+25+1=41

fib(8)=fib(6)+fib(7)+1=25+41+1=67

本文含有隐藏内容,请 开通VIP 后查看