笔试强训48天——day4

一. 单选

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
正确答案:C

二进制:101010b
八进制:0123
十进制:123
十六进制:0x123 123h
%d表示以十进制方式输出
%o八进制输出
%x十六进制方式输出
之前的0不用打印出来
在这里插入图片描述
在这里插入图片描述

 

2. 以下哪个选项一定可以将flag的第二个bit置0()

A flag&=~2
B flag|=2
C flag^=2
D flag>>=2
正确答案:A

考察位运算
按位或 | :遇到1就是1
按位与&:遇到两个1才是1,不同就是0
按位异或^:遇到1就是1,两个相同都是1或都是0,就是0
假设falg = 10
0000 1010
~:1111 0101 取反
flag&=~2 ——flag = falg&(~2):0000 0000
置0一定采用的按位与

 

3. 请声明一个指针,其所指向的内存地址不能改变,但内存中的值可以被改变。

A const int const *x = &y;
B int * const x = &y;
C const int *x = &y;
D int const *x = &y;
E const int * const x = &y;
正确答案:B

const修饰指针的关键:
const在前:const修饰的是解引用的结果不能修改,即指向空间中的内容不能修改
const在
后:const修饰指针变量本身,即指针的值不能修改,指针的指向不能修改

 

4.以下C语言指令:运行结果是什么?

int a[5] = {1,3,5,7,9};
int *p = (int *)(&a+1);
printf(%d,%d”,*(a+1)*(p-1));

A 2,1
B 3,1
C 3,9
D 运行时崩溃

正确答案:C

&a指整个数组,+1就是跳过整个数组
a是数组首元素的地址

 

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

A Oxf8b821c4
B Oxf8b821a6
C Oxf8b82198
D Oxf8b821c0
正确答案:A

方法一
不知道二维数组总共有多少行,每行有多少列:
假设:数组X的起始地址为start,总共有m行,n列
&X[4][4] = start+4n+4 = Oxf8b82140
&X[9][9] = start+9
n+9 = Oxf8b8221c
求得start = n =
带入:
&X[7][7] = start+7*n+7 =
以上方法算术量太大

方法二
&X[4][4] = Oxf8b82140
&X[4][9] = Oxf8b82145
&X[9][9] = Oxf8b8221c
xX[4][9]和X[9][9]之间刚好相隔5行
Oxf8b8221c - Oxf8b82145 = 5n
十六进制数:a10 b11 c12 d13 e14 f15
21c - 145 = d7
5行中总共有d7个元素,即:13
16+7 = 215
n = 43
&X[7][7] = &X[7][9] -2 = &X[4][9] +3*43-2 = Oxf8b821c4
注意加减之前要先将十进制数转换为十六进制数

 

6.根据下面递归函数:调用函数Fun(2),返回值是多少()

int Fun(int n)
{
if(n==5)
return 2;
else
return 2*Fun(n+1);
}

A 2
B 4
C 8
D 16
正确答案:D

在这里插入图片描述

 

7.以下程序的输出结果是:

#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的起始地址
正确答案:A

数组名表示数组首元素地址,只有在&或sizeof之后才表示数组本身
想要指向指针就必须使用二级指针

 

8.求函数返回值,输入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
正确答案:A

假设x = 7 111
1.count = 1,x = 7&6 = 110,x = 6
2.count = 2,x = 6&5 = 100,x =4
3.count = 3,x = 5&4 = 100,x =0
最终返回3
功能:返回x中总共有多少个1
9999:0010011100001111
8个1

 

9.下列程序执行后,输出的结果为()

#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
正确答案:B

cnt实际在统计,斐波那契递归总的次数
f0递归1次
f1递归一次
f2 f0+f1 = 1+1+1递归3次
f3 f2 +f1 = 1+3+1 = 5
f4 f3+f2 = 1+5+3 = 9
f5 f4+f3 = 1+9+5 = 15
f6 1+15+9 = 25
f7 1+25+15 = 41
f8 1+14+25 = 67

 

10.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是()

struct A
{
int a;
short b;
int c;
char d;
};
struct B
{
int a;
short b;
char c;
int d;
};

A 16,16
B 13,12
C 16,12
D 11,16
正确答案:C

A:
4
2~4
4
1~4
16
B:
4
2+1
4
12
 

 

二. 编程

1. 计算糖果

做题链接

A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道
以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所
有题设条件。

输入描述:
输入为一行,一共4个整数,分别为A - B,B - C,A + B,B + C,用空格隔开。 范围均在-30到30之间(闭
区间)。

输出描述:
输出为一行,如果存在满足的整数A,B,C则按顺序输出A,B,C,用空格隔开,行末无空格。 如果不存在
这样的整数A,B,C,则输出No

示例1:
输入
1 -2 3 4
输出
2 1 3

正确答案:

#include <iostream>
using namespace std;

int main() {
    int a,b,c,d;
    cin>>a>>b>>c>>d;

    int A = (a+c)/2;
    int B1 =(b+d)/2; 
    int B2 = (c-a)/2;
    int C = (d-b)/2;

    if(B1 != B2)
    {
        cout<<"No"<<endl;
    }
    else{
        cout<<A<<" "<<B1<<" "<<C;
    }

    return 0;
    }

// 64 位输出请用 printf("%lld")

 

2.进制转换

链接

给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数

输入描述:
输入为一行,M(32位整数)、N(2 ≤ N ≤ 16),以空格隔开。
输出描述:
为每个测试实例输出转换后的数,每个输出占一行。如果N大于9,则对应的数字规则参考16进制(比如,10
用A表示,等等)

示例1:
输入
7 2
输出
111

正确答案:

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

int main() {
string s,table = "0123456789ABCDEF";
int m,n;
cin>>m>>n;

bool flag = false;
if(m<0)
{
    m = -m;
    flag = true;
}

if(m == 0) {
        cout<<"0";
        return 0;
    }

while(m)
{
    s = s+table[m%n];
    m=m/n;
}
if(flag == true)
{
    s += "-";
}
reverse(s.begin(),s.end());
cout<<s<<endl;



   return 0;
}
// 64 位输出请用 printf("%lld")
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hey pear!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值