笔试强训48天——day6

本文介绍了C语言中十进制到八进制的转换,以及C语言中的条件判断输出、数组和指针的相关知识。详细讲解了二维数组的引用、递归函数的应用、指针的内存对齐规则以及结构体的大小计算。同时,通过两个编程题,探讨了二维数组的蛋糕放置问题和字符串转整数的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 单选

1. 十进制变量i的值为100,那么八进制的变量i的值为()

A 146
B 148
C 144
D 142

正确答案:C

一直除8,直到商为0;余数就是八进制数

 

2.执行下面语句后的输出为

int I=1;
if(I<=0)
printf("****\n") ;
else
printf("%%%%\n");

A %%
B ****
C 有语法错,不能正确执行
D %%%%
正确答案:A

printf(格式化串,参数1,参数2,……)
格式化串:printf第一个参数之后的参数要按照什么格式打印
%d——整型
%f——float
%后跟上特定的字符才表示一定的格式化
%Q无效格式——编译器会忽略%——直接输出Q
%%%%
两个%输出一个%

 

3.对于下面的C语言声明描述正确的一项是()

char (*p)[16]

A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
正确答案:C

char* p[16] p是一个数组,该数组中存放的是char*类型的元素
char (*p)[16] p是一个指针,该指针只能指向长度为16的字符数组——数组指针

 

4.数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法

A a[i][j]
B *(a[i]+j)
C ((a+i)+j)
D (a+i4+j)

正确答案:D

 

5.下面程序的输出结果是__________。

#include < iostream.h>
#define SQR(A) A*A
void main() {
int x=6,y=3,z=2;
x/=SQR(y+z)/SQR(y+z);
cout< < x< < endl;
}

A 5
B 6
C 1
D 0
正确答案:D

预处理:将宏展开
x/ = 3+23+2/3+23+2=17
x = 6/17 = 0

 

6.当n=5时,下列函数的返回值是()

int foo(int n){
if(n<2){
return n;
}
else
return 2*foo(n-1)+foo(n-2);
}

A 5
B 11
C 29
D 10
正确答案:C

递归算法

 

7.以下对C语言的”指针“描述不正确的是()

A 32位系统下任何类型指针的长度都是4个字节
B 指针的数据类型声明的是指针实际指向内容的数据类型
C 野指针是指向未分配或者已释放的内存地址
D 当使用free释放掉一个指针内容后,指针变量的值被置为NULL

正确答案:D

free只是将p指向的空间释放掉,并不会将p置空

 

8. 数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示()(从第0行开始)

A a[1][0]+2
B a数组第1行第2列元素的地址
C a[0][1]+2
D a数组第1行第2列元素的值

正确答案:B

a是二维数组,二维数组中的每个元素都是一维数组
*(a+1)访问数组第1个元素
+2第二列元素的地址

 

9.有一个如下的结构体:请问在64位编译器下用sizeof(struct A)计算出的大小是多少()

struct A{
long a1;
short a2;
int a3;
int *a4;
};

A 24
B 28
C 16
D 18
正确答案:A

64位编译器 对齐数是8 指针大小也是8
8 2+4 8 = 24

 

10.运行结果是()

#include <iostream>
using namespace std;
int f(int n){
if (n==1)
return 1;
else
return (f(n-1)+n*n*n);
}
 int main(){
int s=f(3);
cout<<s<<endl;
return 0;
} 

A 8
B 9
C 27
D 36

正确答案:D

考察递归

 

 

二. 编程

1. 不要二

链接

二货小易有一个W*H的网格盒子,网格的行编号为0H-1,网格的列编号为0W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。

输入描述:
每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:
输出一个最多可以放的蛋糕数

示例1:
输入
3 2
输出
4

思路:
数学问题
由题目可看出:
假设放蛋糕的位置是(x1,y1),则不能放蛋糕的位置(x2,y2),满足x1x2,y1-y22或者x1-x22,y1y2.
如果[i][j]位置放了蛋糕,那么[i+2][j]与[i][j+2]的位置就不可以放蛋糕
注意:防止[i+2]与[j+2]越界!
1.二维数组初始化全置为1
2.从[0][0]开始放,不能放蛋糕的位置置0
3.遍历数组,有1计数器++,有几个1就可以放几个蛋糕

正确答案:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
int w,h,res = 0;
cin >> w >> h;
vector<vector<int>> a;
a.resize(w);
for(auto& e : a)
e.resize(h, 1);
for(int i=0;i<w;i++)
{
for(int j=0;j<h;j++)
{
if(a[i][j]==1)
{
res++;
// 标记不能放蛋糕的位置
if((i+2)<w)
a[i+2][j] = 0;
if((j+2)<h)
a[i][j+2] = 0;
}
}
} cout << res;
return 0;
}

 

2. 把字符串转换成整数

链接

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法
的数值则返回 0
数据范围:字符串长度满足

注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
输入描述:
输入一个字符串,包括数字字母符号,可以为空
输出描述:
如果是合法的数值表达则返回该数字,否则返回0

示例1:
输入
“+2147483647”
输出
2147483647
示例2:
输入
“1a33”
输出
0

正确答案:

class Solution {
public:
    int StrToInt(string str) {

        if(str.empty())
        return 0;

        int flag = 1;     
        if(str[0] == '+')
        {
            flag = 1;
            str[0] = '0';
        }
       else if(str[0] == '-')
        {
            flag = -1;
            str[0] = '0';
        }

        int sum = 0;
        for(int i= 0;i<str.size();i++)
        {
            if(str[i] < '0' || str[i] > '9')
            {
                sum = 0;
                break;
            }

            sum = sum *10 + str[i] - '0';
        }

        return flag*sum;
    }
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hey pear!

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

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

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

打赏作者

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

抵扣说明:

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

余额充值