目录
一.选择题
1.[单选题]十进制变量i的值为100,那么八进制的变量i的值为()
A 146 B 148 C 144 D 142
解析:
这道题很简单,将十进制转换为八进制,将100商8,将所有余数按顺序排列就是了。
答案就是C
2.[单选题]执行下面语句后的输出为()
int I=1;
if(I<=0)
printf("****\n") ;
else
printf("%%%%\n");
A %% B **** C 有语法错,不能正确执行 D %%%%
解析:
这里主要考察的是格式化串。
对于printf,它是格式是printf(格式化串,参数1,参数2,......)
格式化串:printf第一个参数只会的参数要按照指定的格式打印
比如:%d——>按照整型方式打印
%f——>按照float方式打印
......格式化串有一定的规定:%之后跟上C语言特点的字符才能表示一定的格式化,如果不是特点的,比如%Q,那么在打印的时候,%视为无效,直接打印Q。
回到题目中,我们需要执行的语句是printf("%%%%\n"),这也是个特殊情况,两个%打印一个%,所以答案是A。
3.[单选题]对于下面的C语言声明描述正确的一项是()
char (*p)[16]
A p是长度为16的字符指针数组
B p是包含16个字符的字符串
C p是指向长度为16的字符数组的指针
D p是长度为16的字符数组
解析:
因为p与*号结合了,所以p是一个指针,不是数组,代表着该指针指向的是长度为16的数组。
没有结合,p才是数组,比如说是:char *p[16],代表p是一个指针数组。
所以,答案选C
4.[单选题]数组a的定义语句为“float a[3][4];”,下列()是对数组元素不正确的引用方法
A a[i][j] B *(a[i]+j) C *(*(a+i)+j) D *(a+i*4+j)
解析:
这道题考察的是对二维数组的理解。
对于一个二维数组a[i][j],我们可以看作是i个一位数组,长度是j。
在访问一维数组的时候,是a[i]这样写的,而且a[i]==*(a+i);
所以,对于访问二维数组:
①a[i][j] ②*(a[i]+j):意思是先在a[i]行找第j列,然后解引用
③*(*(a+i)+j):这个跟②是一样的。④这个不行,因为a+i*4,如果i==1,就是a+4+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
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
解析:
在64系统下,指针是8个字节,32系统是4个字节
指针的数据类型,比如int* a,a的内容就是int类型的
C选项考察的是野指针的定义
D的话,当free掉后,指针变量的内容没有被置为NULL,而是指针失去了这个地址,需要主动去置空。如果不置空,就会变成野指针。
防止野指针:①free后置空 ②不要越界访问 ③创建指针的时候进行初始化
所以选D;
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列元素的值
解析:
这个跟第四题类型。
对于*(a+1)+2,首先(a+1)拿到的是这个二维数组第1行的地址,然后*(a+1)是对其进行解引用,拿到的是第1行的内容,然后是*(a+1)+2,它表示的是a数组第一行第二列那个元素的地址,因为没有解引用。
所以选B;
9.[单选题]有一个如下的结构体:
struct A{
long a1;
short a2;
int a3;
int *a4;
};
请问在64位编译器下用sizeof(struct A)计算出的大小是多少()
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
解析:
这里考察的也是递归的理解和运行,f(3)= f(2)+3*3*3;f(2)=f(1)+2*2*2;f(1)=1;f(3)=1+2*2*2+3*3*3=36,因此答案选D
二.编程题
1.题目:不要二
题目描述:二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能 等于2。 对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为: ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根 小易想知道最多可以放多少块蛋糕在网格盒子里。
输入描述:每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)
输出描述:输出一个最多可以放的蛋糕数
示例1:输入:3 2 输出:4
分析:
对于知道题,我们可以从两个格子坐标的欧几里得距离入手:因为两个各种的欧几里得距离不能等于2,相对于是两个坐标直接的距离的平方不能为4,所以可以写出:
(x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) = 4 ,接着我们分析出,
在整数中4是由0+4 = 4,4+0=4,2+2=4,1+3=4,3+1=4这五种加法得出。
在这五种当中,只有0+4和4+0成立,其它三种不成立。为啥?
对于3+1:没有一个数(整型int)的平方(x1-x2) * (x1-x2)可以等于3,只能1*1,2*2 ...所以这个加法不行,同理2+2,1+3也如此。
得出这个结论后,我们对0+4和4+0进行分析:
对于0+4:即x1-x2 = 0,y1-y2=2,所以是x1=x2,y1=2+y2
对于4+0:即x1-x2=2,y1-y2=0,所以是x1=2+x2,y1=y2
也就是说,当我们在a[i][j]这个位置放置了蛋糕后,a[i][j+2]和a[i+2][j]这两个位置不能放了!
得出最终结论后,我们先创建一个二维数组,然后将其初始化为1.然后开始遍历,如果是1,然后将它对应的两个位置置为0,一直遍历到结束,每次进行计数便可。
代码如下:
int main() { int w, h, cnt = 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) { cnt++; if ((i + 2) < w) { a[i + 2][j] = 0; } if ((j + 2) < h) { a[i][j + 2] = 0; } } } } cout << cnt << endl; return 0; }
2.题目:把字符串转换成整数
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0。数据范围:字符串长度满足 0<=n<=100
注意: ①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0 ②字符串中可能出现 +/- 且仅可能出现在字符串首位。
输入描述:输入一个字符串,包括数字字母符号,可以为空
输出描述:如果是合法的数值表达则返回该数字,否则返回0
示例1:
输入:
+2147483647
1a33
输出:
2147483647
0
分析:
解题思路非常简单,就是上次计算的结果*10,相当于10进制进位,然后加当前位的值。
例如:
“123”转换的结果是
sum=0
sum*10+1->1
sum*10+2->12
sum*10+3->123
本题的关键是要处理几个关键边界条件:
1. 空字符串
2. 正负号处理
3. 数字串中存在非法字符
代码如下:
class Solution { public: int StrToInt(string str) { if (str.empty()) return 0; int symbol = 1; if (str[0] == '-') //处理负号 { symbol = -1; str[0] = '0'; //这里是字符'0',不是0 } e lse if (str[0] == '+') //处理正号 { symbol = 1; str[0] = '0'; } i nt sum = 0; for (int i = 0; i < str.size(); ++i) { if (str[i] < '0' || str[i] > '9') { sum = 0; break; } s um = sum * 10 + str[i] - '0'; } r eturn symbol* sum; } };