解题思路:


第一:使用绝对值进行对比,输出时是原值

第二:最小位置与最后一位进行交换

使用math库里面的abs函数,其返回值是原值的绝对值,使用数组下标进行比较,可以少写一个储存最小值的变量。

使用异或运算符进行交换,加快运行速度。

异或运算符的原理为 相异出1 例如(1101)^(1010) = 0111(二进制位置上不同得1,相同为0)

这样就有两个性质

  1. n*n=0(n与自己的二进制位都相同,异或后值为0)

  2. n*0=n(n的二进制与0做异或,0^0=0不变,1^0=1也不变0)

根据这两个性质,就可以写出交换了(使用位运算速度会快很多)

a=a^b

b=a^b

a=a^b

具体代码为以上三行

a=a^b (第一行 a=a^b 后面的a就代表(a^b)

b=a^b (这里实际是b=(a^b)^b,因为b^b=0,a^0=a,所以这里的b=a的原值,后面的b就代表(a^b)^b)

a=a^b (这里实际是a=(a^b)^((a^b)^b),两个a三个b,实际值为b)

经过以上操作就完成了交换。

其实这样也可以看出第三个性质,偶数的n做异或,最后值为0,奇数的n做异或,最后值为n。

注意使用异或交换 a不能等于b,否则最后为a=b,b=0

(也可以使用c++的内置函数swap,一行就可以)

参考代码:

#include <iostream>
#include <cmath>

using namespace std;

int main () {

	int t=0,p[17];//t代表下标 
	//输入的同时找出最小绝对值所在的位置 
	for(int i=0; i<10; i++) {
		cin>>p[i];
		if(abs(p[t])>abs(p[i]))t=i;
	}
	//与最后一位交换 
	if(t!=9) {
		p[t]=p[t]^p[9];
		p[9]=p[t]^p[9];
		p[t]=p[t]^p[9];
	}
//	swap(p[t],p[9]);//c++系统内置的交换函数 
	//打印 
	for(int i=0; i<10; i++)cout<<p[i]<<" \n"[i==9];
	return 0;
}

以上。

点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 1 条评论

指针原来是套娃的 1年前 回复TA
a=a^b

b=a^b

a=a^b
可以简化成
a^=b^=a^=b