指针原来是套娃的


私信TA

用户名:uq_92467646842

访问量:43493

签 名:

数学改变科学,科学改变世界

等  级
排  名 10
经  验 25191
参赛次数 49
文章发表 128
年  龄 0
在职情况 学生
学  校
专  业 物联网工程

  自我简介:

QQ:2830671713

解题思路:


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

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

使用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分

154 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

a=a^b

b=a^b

a=a^b
可以简化成
a^=b^=a^=b
2023-01-22 13:43:46
  • «
  • 1
  • »