解题思路:
第一:使用绝对值进行对比,输出时是原值
第二:最小位置与最后一位进行交换
使用math库里面的abs函数,其返回值是原值的绝对值,使用数组下标进行比较,可以少写一个储存最小值的变量。
使用异或运算符进行交换,加快运行速度。
异或运算符的原理为 相异出1 例如(1101)^(1010) = 0111(二进制位置上不同得1,相同为0)
这样就有两个性质
n*n=0(n与自己的二进制位都相同,异或后值为0)
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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复