【C++】笔试训练(六)

目录

一、选择题

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

A 146

B 148

C 144

D 142

答案:C

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

cpp 复制代码
int I = 1;
if (I <= 0)
	printf("****\n");
else
	printf("%%%%\n");

A %%

B ****

C 有语法错,不能正确执行

D %%%%

答案:A

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

cpp 复制代码
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、下面程序的输出结果是__________。

cpp 复制代码
#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

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

cpp 复制代码
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
解析:int * pa:pa指向的是int类型的空间。
int * p = (int *)malloc(4);
free ( p );
free只是将p指向的空间释放了,并不会将p指针置为NULL

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+1:表示数组a中第1个元素的地址
*( a + 1):表明数组a中的第一个元素
a又是一个二维数组,二维数组中的每个元素都是一维数组, * (a+1) 实际是一个一维数组

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

cpp 复制代码
struct A {
	long a1;
	short a2;
	int a3;
	int* a4;
};

A 24

B 28

C 16

D 18

答案:A

10、下列代码,运行结果是()

cpp 复制代码
#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、不要二

入口:题目链接

题目描述:

题目解析:

本题本质就是在二维数组中每个坐标去放蛋糕,一个坐标位置放了蛋糕,跟他欧几里得距离为2的位置不能放蛋糕,这个就是关键点。对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 。

也就是说:如果(x1,y1)放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4的(x2,y2)不能放蛋糕。

( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4看起来是一个无解的表达式,但是可以进行加法表达式分解:

1+3=4

3+1=4

2+2=4

0+4=4

4+0=4

分析前三个表达式是不可能的,因为(x1-x2) * (x1-x2)表达式结果不能等于2或3。

也就是说( (x1-x2) * (x1-x2) 和(y1-y2) * (y1-y2) )两个表达式一个等于0,一个等于4。

可以看出:假设放蛋糕的位置是(x1,y1),则不能放蛋糕的位置(x2,y2),满足 x1 == x2, y1 - y2 == 2或者x1 - x2 == 2, y1 == y2。

解题思路:

使用vector<vector>定义一个二维数组,resize开空间并初始化,每个位置初始化为1,表示当蛋糕,a[i][j]位置放蛋糕,则可以标记处a[i][j+2]和a[i+1][j]位置不能放蛋糕,遍历一遍二维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。

代码展示:

cpp 复制代码
#include <iostream>
#include <vector>

using namespace std;

int main()
{
	int w, h;
	int count = 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)
			{
				count++;
				if (i + 2 < w)
				{
					a[i + 2][j] = 0;
				}
				if (j + 2 < h)
				{
					a[i][j+2] = 0;
				}
			}
		}
	}
	cout << count << endl;
	return 0;
}

2、把字符串转换成整数

入口:题目链接

题目描述:

题目解析:

本题本质是模拟实现实现C库函数atoi,不过参数给的string对象

解题思路:

把上次计算的结果 * 10,相当于10进制进位,然后加当前位的值。

例如:"123"转换的结果是:

sum=0

sum10+1->1
sum
10+2->12

sum*10+3->123

本题的关键是要处理几个关键边界条件:

  1. 空字符串
  2. 正负号处理
  3. 数字串中存在非法字符

代码展示:

cpp 复制代码
class Solution {
public:
    int StrToInt(string str) {
        if (str.empty())
        {
            return 0;
        }
        int flg = 1;
        if (str[0] == '-') //处理负号
        {
            flg = -1;
            str[0] = '0'; //这里是字符'0',不是0
        }
        else if (str[0] == '+') //处理正号
        {
            flg = 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 flg * sum;
    }
};
相关推荐
因特麦克斯3 分钟前
每日一题&智能指针
数据结构·算法·leetcode
蹉跎x13 分钟前
力扣104. 二叉树的最大深度
算法·leetcode·职场和发展
gaogao_jack14 分钟前
[Leetcode小记] 3233. 统计不是特殊数字的数字数量
java·算法·leetcode
澄澈i21 分钟前
设计模式学习[9]---模板方法模式
c++·学习·设计模式·模板方法模式
沃和莱特22 分钟前
C++中类的继承
数据库·c++·编程·c·指针·友元函数
zzzhpzhpzzz29 分钟前
设计模式——解释器模式
算法·设计模式·解释器模式
一只鸡某39 分钟前
实习冲刺第二十九天
数据结构·c++·算法·leetcode
鲨鱼吃橘子1 小时前
【C++融会贯通】哈希表的使用
c语言·开发语言·数据结构·c++·链表·哈希算法·散列表
誓约酱1 小时前
Linux系统常用指令
linux·运维·服务器·c++
ZZZ_O^O1 小时前
【贪心算法入门第一题——860.柠檬水找零】
学习·算法·leetcode·贪心算法