跟“龙哥”学C语言编程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

答案解析

1.见图2.10.3。

2.通过scanf函数每次读取一个字符,判断其范围是否在a和z之间,然后减32即可得到对应的大写字母。按组合键Ctrl+Z结束输入。代码如下:

img

3.因为短路运算,所以a和b的值分别为5和3。

4.(1)十进制数转换为二进制数所采用的方法就是不断地除以2。详细代码如下:

img

(2)二进制数转换为十进制数,就是将二进制数的每一位乘以2的幂次,最低位是2的零次幂。代码如下:

img

(3)同(1),把N改为16即可。

(4)十六进制数转换为十进制数,就是把每一位乘以16的幂次,最低位是16的零次幂,一开始读取时与(2)有一些差异,详细代码如下:

img

5.正数在内存中存储的是原码,负数在内存中存储的是补码,无论是原码还是补码,我们统计的都是实际在内存中二进制数为1的个数,使用移位操作就可以实现。代码如下:

img

6.(1)异或:相同数字得到0,任何数与零异或,最终得到自身,同时异或满足交换律。通过这些特性,我们将101个数全部异或,就能找到出现一次的那个数。代码如下:

img

(2)首先将所有的数异或,因为有两个数出现一次,所以最终得到的异或结果,实际上是两个出现一次的数的异或结果,由结果的最低位为1可以得知,出现一次的两个数的这一位一定不同,因此拿该位与所有的数按位与,为1的放在一堆,为0的放在另一堆,就能将两个出现一次的数分开,然后对两堆各自异或,就能找到出现一次的两个数。代码如下:

img

(3)由于3个数字出现一次,其他数字均出现两次,因此可以得到n一定为奇数。

3个只出现一次的数字,它们的bit位肯定不可能全部相同,也就是说,虽然有些bit位上的数可能相等,但肯定至少存在某个bit位,在这3个数中,有两个数的该bit位为1,一个数的该bit位为0,或者两个数的该bit位为0,一个数的该bit位为1。

我们可以通过扫描int的所有bit位,扫描每个bit位时,遍历数组,如果能找出符合上面条件的,就可以找出其中一个只出现一次的数字,该数字与另外两个只出现一次的数的bit位不同。通过bit位不同分成两堆,对每堆进行异或,如果异或结果表明两堆均不为零,那么说明分开了,偶数个数的那堆有两个数,奇数个数的那堆有一个数。代码如下:

img

判断a中特定的位是否为1,若特定的位为 1,则返回true。

这里要判断的特定位由b确定,b中只有一位为1,其他位均为0,由FindFirstBit1函数返回,而a中要判断的位便是b中这唯一的1所在的位是否为1。代码如下:

img
img
img
img