选择题
解析:本题考查
printf
的输出。%o
表示是以八进制的形式输出,没有#
输出的数值前面就不会有0。m本身就表示八进制;n转化成八进制就是n除以8取余,结果就是173。%x
是以十六进制的方式输出。
解析:本题查看位操作符。
~
表示按位取反;|
表示按位或;&
表示按位与;^
表示按位异或;>>
是右移操作符。2的第二个bit一定为1,按位取反之后第二个bit为0,此时再&flag,则flag的第二个bit无论是1还是0,遇见0都会变为0。
解析:题目中要求的就是声明一个指针常量,要求
const
修饰的是指针本身,所以符合要求的就是B。
解析:数组名表示数组首元素的地址,
&数组名
则表示取的是整个数组的地址。*(a+1)
中a+1
表示的就是数组中下标为1的元素的地址,*(a+1)
可以表示为a[1]
即数组中第2个元素;&a+1
表示的是数组中最后一个元素后的地址,p-1
表示的就是数组中最后一个元素的地址,*(p+1)
就是数组最后一个元素9。
解析:本题考查的是二维数组元素之间的位置关系。
解析:本题考查递归。
解析:数组a为字符指针数组,数组中元素均为指针,指向的是字符串首元素的地址。
char **p
表明指针p是一个二级指针,指针指向的类型是char*,p=a
表明p指针指向a数组的首元素的地址。传参传p表明m也指向字符指针数组a中首元素的地址,++m表示m向后移动一个指针大小,此时m指向的就是字符指针数组a中第二个元素的地址,解引用得到的就是afternoon
。
解析:这题只需要知道9999的二进制中有多少个1即可。
我们随便假设n = 9,n = 9的时候有2个1,所以count = 2。9999转化为二进制是10011100001111。所以选A。
解析:需要自己认真的画图计算一下。
解析:结构体内存对齐,默认对齐数为4字节。
编程题
1.计算糖果
解析:假设A - B = a 、B - C = b 、A + B = c 、B + C = d 。这道题目的实质是:判断三元一次方程组是否有解及求
解,得到A=(a+c)/2、C=(d-b)/2、B2=(b+d)/2、B1=(c-a)/2;如果B1不等B2则表达式无解。这里需要注意计算出来的A和C值是固定的,也就是只通过a,b,c,d计算得到的A和C的值是固定的,B的值可能不相同,所以重点是要判断由a,b,c,d计算得到的B是否相同。
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d;
cin >> a >> b >> c >> d;
int A = (a + c) / 2;
int C = (d - b) / 2;
int B1 = (c - a) / 2;
int B2 = (b + d) / 2;
if(B1 != B2)
cout << "No";
else
cout << A << " " << B1 << " " << C;
return 0;
}
2.进制转换
答案解析:本题思路很简单,首先想清楚原理:N进制数,每个进制位的值分别是X0N0,X1*N1, X2N^2…,X0,X1,X2就是这些进制位的值,就是进行取模余数就是当前低进制的位的值是多少,通过除掉进制数,进入下一个进制位的计算。
本人理解:先设立一个表table,里面存放0~F,其下标对应相应的进制转换之后的数。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main() {
string s1;
string table = "0123456789ABCDEF";
bool flag = false; // 当为负数的时候改为true
int M = 0;
int N = 0;
cin >> M >> N;
if(M < 0)
{
M = 0 - M;
flag = true;
}
while(M)
{
s1 += table[M%N];
M /= N;
}
if(flag)
{
s1 += '-';
}
reverse(s1.begin(),s1.end());
if(s1.empty())
cout << "0";
else
cout << s1;
return 0;
}