目录
一、选择题
1、
解析:在C语言中,以0开头的整数常量是八进制的,而不是十进制的。所以,0123的八进制表示相当于83的十进制表示,而123的十进制表示不变。printf函数用%o格式符输出八进制数,所以输出结果是123 173。
2、
解析:为在C语言中,按位与运算符&可以用来清除某些位,而按位或运算符|可以用来设置某些位 。如果要将flag的第二个bit置0,就需要用flag和一个只有第二个bit为0的数进行按位与运算,这个数就是~2,即2的按位取反。所以,flag&=~2就可以实现这个目的。
3、
解析:由题可得,&x[4][4]= Oxf8b82140,&x[4][9]= Oxf8b82145,&x[9][9] = Oxf8b8221c,而x[4][9]和x[9][9]之间刚好相隔了5行,设每行N个元素,Oxf8b8221c - Oxf8b82145 = 5*N,得到N=43。
&x[7][7] = &x[7][9]- 2,&x[4][9]+3*43- 2,可得到0xf8b82145 + 127为x[7][7]的地址。答案为A。
4、
解析:首先,定义了一个静态字符指针数组a,它包含了三个字符串元素:"morning","afternoon","evening"。然后,定义了一个字符指针的指针p,它指向了a的首地址,也就是第一个元素"morning"的地址。接着,调用了func函数,传入了p作为参数。在func函数中,参数m是一个字符指针的指针,它接收了p的值,也就是a的首地址。然后,对m进行了自增操作,使得m指向了a的下一个元素,也就是第二个元素"afternoon"的地址。最后,输出了m所指向的内容,也就是字符串"afternoon"。
5、
解析:**这个函数的功能是计算一个整数x的二进制表示中有多少个1。**然后,进入一个while循环,只要x不为0,就执行以下操作:
- 将count加1,表示找到了一个1。
- 将x与x-1进行按位与运算,并将结果赋给x。这个运算的作用是将x的最低位的1变成0,例如:如果x=1010(二进制),那么x-1=1001(二进制),x&(x-1)=1000(二进制)。
- 最后,当x变为0时,退出循环,返回count的值,表示x的二进制表示中有多少个1。
6、
解析:F2: FO+F1=递归3次,F3: F2+F1=1+3+1 = 5,F4: F3+F2=1+5+3=9
F5: F4+F3=1+9+5=15,F6: F5+F4=1+15+9=25,F7: F6+F5=1+25+15=41,
F8: F7+F6=1 +41 +25 = 67
二、编程题
1、计算糖果
题目解析: 这道题目的实质是:判断三元一次方程组是否有解及求解, 这里是小学生都会的问题了。A=(a+c)/2;C=(d-b)/2;B2=(b+d)/2,B1=(c-a)/2;
如果B1不等B2则表达式无解。
代码如下:
cpp
#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进制数,每个进制位的值分别是X0*N^0,X1*N^1, X2*N^2.....,X0,X1,X2就是这些进制位的值。
首先定义一个字符串table,用于存储0到F的字符,表示从0到15的数。然后定义一个字符串str,用于存储转换后的结果。接着定义一个布尔变量flag,用于判断输入的数是否为负数。如果是负数,就将flag设为true,并将M取反。如果M为0,就直接将str设为"0"。
然后进入一个循环,不断地对M进行取余和除法操作,将M除以N得到的余数作为table的下标,找到对应的字符,并将其添加到str的末尾。同时将M更新为M除以N得到的商。当M为0时,退出循环。
最后判断flag是否为true,如果是,就在str的末尾添加一个负号。然后将str反转,输出结果。这样就完成了10进制转换成任意进制的过程。
cpp
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
int main() {
int M, N;
string table = "0123456789ABCDEF";
string str = "";
bool flag = false;
while (cin >> M >> N) {
if (M < 0) {
flag = true;
M = -M;
}
if (M == 0)str = "0";
while (M) {
str += table[M % N];
M = M / N;
}
if (flag)str += '-';
reverse(str.begin(), str.end());
}
cout << str << endl;
}