练习题的讲解(大小端存储)

一、

题目:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。

讲解:

这个题目到手后脑子中有许多的解法,比如将数组元素一个个的判断奇数偶数,然后奇数放到一个数组,偶数放到一个数组,最后将两个数组在放到一个数组,然后打印出来…………

我认为,这些方法可行,但是复杂,有没有简单的方法呢?

下面是我写的代码,我在完成就排序的基础上又写了一个函数,对奇偶排序完成的数组,再一次进行了排序,使得奇数与偶数部分不仅分开,而且规律的从小到大排序出来。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16

arr数组变为这个时

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_12,color_FFFFFF,t_70,g_se,x_16

结果:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_9,color_FFFFFF,t_70,g_se,x_16

 二、

题目:下列函数运行的结果是什么

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_9,color_FFFFFF,t_70,g_se,x_16

讲解:看到这个题目,一看好简单啊,a+b这不300吗,c又等于a+b,直接300,300。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_7,color_FFFFFF,t_70,g_se,x_16

可是,结果却是:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_9,color_FFFFFF,t_70,g_se,x_16

然后,直接凉凉。

先仔细看,a,b,c全都是无符号char类型。char类型只能储存8个二进制位,数值为0~255

a中实际储存的为11001000

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_12,color_FFFFFF,t_70,g_se,x_16

b中实际储存的为01100100

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_12,color_FFFFFF,t_70,g_se,x_16

计算a+b时,由于a,b为char类型,没有达到int的大小,所以要发生整形提升,a和b均为无符号数,所以最高位不是符号位,高位补零。
 a:00000000000000000000000011001000
 b:00000000000000000000000001100100
 a+b=00000000000000000000000100101100
 c为无符号char类型,只能存放8个二进制位
 c:00101100
 以%d(有符号数)的方式进行打印
 a+b:00000000000000000000000100101100
 符号位为0,正数,300

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_15,color_FFFFFF,t_70,g_se,x_16
 c:00101100
 发生整型提升,c为无符号数,高位补0
 c:00000000000000000000000000101100
 符号位为0,正数,44 

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_14,color_FFFFFF,t_70,g_se,x_16

 三、

题目:在32位大端处理器上变量b等于()

A:0x00

B:0x12

C:0x34

D:0x1234

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_12,color_FFFFFF,t_70,g_se,x_16

讲解:这里涉及到一个知识点,大端字节和小端字节。

大端字节:把数据的低位字节内容存放在高地址处,高位字节放在低地址处

小端字节:把数据的低位字节内容存放在低地址处,高位字节放在高地址处

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_15,color_FFFFFF,t_70,g_se,x_16

因为是大端处理器,所以存储应为00 00 12 34

&a强制类型转换(unsigned char*)只能访问一个字节,00,所以b里面存放的就是0x00

四、

题目:写一个函数打印杨辉三角

讲解:首先先画一个杨辉三角出来

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_4,color_FFFFFF,t_70,g_se,x_16

画出来一看。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_7,color_FFFFFF,t_70,g_se,x_16

哎呦,这可怎么打印哦。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_8,color_FFFFFF,t_70,g_se,x_16

我们进行简化一下。

写成下面这种形式

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_5,color_FFFFFF,t_70,g_se,x_16

再一看,哎,这不是一个二维数组?没错,就用这种思想来进行打印杨辉三角,但不是每个元素都是输上去的,而是发现规律进行计算得到。什么规律呢?我们发现第一列和对角线元素皆为1,从第三行第二列开始元素为上一行的前一列和这一列的和。

所以元素赋值可以这样写:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_18,color_FFFFFF,t_70,g_se,x_16

接下来是打印元素 ,可以直接打印吗?可以,用下面程序打印出来就是楼梯状的杨辉三角。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_12,color_FFFFFF,t_70,g_se,x_16

打印结果:

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_10,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_7,color_FFFFFF,t_70,g_se,x_16

这时候就有有人说了,哎呀,不是 ,这啥,这是杨辉三角?

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_6,color_FFFFFF,t_70,g_se,x_16

 怎么了,这不是直角三角形?开玩笑!!!你怕是不懂哦。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_6,color_FFFFFF,t_70,g_se,x_16

现在对了吧 4a3e96667f5a4561bcb544b0e901c096.png

下面是新的打印函数:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16 空格怎么控制呢?我们发现,如果打印n行杨辉三角,那么第n行就顶格打印,没有空格,然后每少一行,空格多一个,也就是说第一行应该有n个空格。

但是程序中第一行是可不是第一行啊,是第0行(i=0),所以,空格数应该是n-1个,

第二行,也就是程序中的第一行(i=1)就是n-1-i个空格

所以空格数只需要小于n-1-i 就行了。

下面是完整程序:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16

 五、

 题目:猜凶手,某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个

以下为4个嫌疑犯的供词:

A:不是我

B:是C

C:是D

D:C在胡说

已经知道3个人说了真话,1个人说了假话,写一个程序判断凶手。

讲解:看到题目有点懵,这是啥啊,智力题啊?编程怎么搞嘛。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_6,color_FFFFFF,t_70,g_se,x_16

仔细分析发现,这考的不就是逻辑关系吗,条件判断而已。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_16,color_FFFFFF,t_70,g_se,x_16

 经过分析发现符合条件的只有C是凶手的时候。

程序怎么写呢,很简单,我只需要创建一个变量为Killer,然后将killer从A到D进行赋值判断,ABCD所说的话定为判断条件,真的为1,假的为0;最后加起来看看等不等于3,等于就把此时killer所赋值的内容打出来就行了。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_5,color_FFFFFF,t_70,g_se,x_16

程序:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYmluZ2JpbmdfYmFuZw==,size_20,color_FFFFFF,t_70,g_se,x_16

 结果:

6476cc29b2af422e90c2e2d3702397ec.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bingbing~bang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值