一、选择题
1、十进制变量i的值为100,那么八进制的变量i的值为()
A 146
B 148
C 144
D 142
2、执行下面语句后的输出为
int I = 1;
if (I <= 0)
printf("****\n");
else
printf("%%%%\n");
A %%
B ****
C 有语法错,不能正确执行
D %%%%
3、对于下面的C语言声明描述正确的一项是()
char(*p)[16]
A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
4、数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法
A a[i][j]
B *(a[i]+j)
C ((a+i)+j)
D (a+i4+j)
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
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
7、以下对C语言的”指针“描述不正确的是()
A 32位系统下任何类型指针的长度都是4个字节
B 指针的数据类型声明的是指针实际指向内容的数据类型
C 野指针是指向未分配或者已释放的内存地址
D 当使用free释放掉一个指针内容后,指针变量的值被置为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列元素的值
9、有一个如下的结构体:请问在64位编译器下用sizeof(struct A)计算出的大小是多少()
struct A {
long a1;
short a2;
int a3;
int* a4;
};
A 24
B 28
C 16
D 18
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
二、编程题
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]位置不能放蛋糕,遍历一遍二维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。
代码展示:
#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
sum10+2->12
sum*10+3->123
本题的关键是要处理几个关键边界条件:
- 空字符串
- 正负号处理
- 数字串中存在非法字符
代码展示:
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;
}
};