不使用中间变量交换两个数. 求平均数考虑溢出

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include<stdlib.h>

//不使用中间变量交换两个数的值

void exchange_num(int *a, int *b)

{

①* a =*a + *b;    //适用范围广

* b = *a -* b;

* a =* a - *b;

②* a = (*a )*(*b);

* b = (*a )/(*b);

* a = (*a ) / (*b);//当两个数有一个0或者都为0时就不再适用

③* a = *a ^*b; //把*a和*b中所有的不同位拿出来

* b = *a ^*b; //因为这时候*a中保存的是*a和*b的不同位,所以再异或*b就把最初的*a拿出来

* a = *a ^*b;//同理,因为*b已经是最初的*a,所以两个数不同位再异或*b就将最初*b拿出来了

}

int main()

{

int a = 0, b = 0;

scanf( "%d%d" , &a, &b);

exchange_num(&a,&b);    //因为形参只是一份临时拷贝,所以进行“址”传递

printf( "a=%d,b=%d" , a, b);

system( "pause" );

return 0;

}

//求两个数的平均值,考虑溢出

int average(int a, int b)

{

int ret = 0;

① ret = ( a + b )>>1;

//当a,b都特别大的时候,a+b有可能会产生溢出的危险,所以一般我们用下面这三种方法,来求两个数的平均数

②ret = a + (b - a)>> 1;

③ret = b + (a - b)>>1;

④ret = ( a &b )+((a^b)>>1);

return ret;

//我们知道,十进制的两个数求和,等于其对应的二进制求和。a&b:是将a和b的相同位拿出来,a^b是将a和b不同的位拿出来。当我们在求平均值时,两个二进制相加再除以2就是所求的平均值,而相同的位加起来再除以2相当于没有改变,所以依然是a&b,相异的位加起来要除以2所以是(a^b)/2.

}

int main()

{

int a = 0, b = 0;

scanf( "%d%d" , &a, &b);

int ret = average(a,b);

printf( "%d\n" , ret);

system( "pause" );

return 0;

}

时间: 2024-08-01 18:04:47

不使用中间变量交换两个数. 求平均数考虑溢出的相关文章

不使用中间变量交换两个数

第一种用数学思维,第二种用异或 如交换a,b 1:    a=a+b;        b=a-b;        a=a-b; 2:    a=a^b;        b=b^a;        a=a^b; 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int a,b; c

不用中间变量交换两个数 swap(a,b);

#include <iostream> using namespace std; int main () { int a = 3; int b = 5; cout<<"a="<<a<<",b="<<b<<endl; a = a+b; ///a=7 b = a-b; ///b=3; a = a-b; ///a=5 cout<<"a="<<a<<

算法-不使用中间变量交换两个数

这个应该是烂大街的一个题目了,闲来无事,随便写写,常用的有三种方法,加减法,乘除法,异或法: 1.加减法,这个是最容易的想到的,不过需要注意的,如果在处理浮点型数字的时候可能会精度丢失: a=a+b; b=a-b; a=a-b; 2.乘除法,和加减法类似,也会有精度丢失,不过出现的一个问题是除数不能为0: a=a*b; b=a/b; a=a/b; 3.异或法,这个需要记住的一点就是变量a异或b的异或值异或b等于a: a=a^b; b=a^b; a=a^b;

交换两个数的值,不适用第三个变量

交换两个数的值,不适用第三个变量 一.源代码:SwapTwoNumber.java 1 package cn.com.zfc.help; 2 3 /** 4 * 不适用中间变量交换两个数 5 * 6 * @author zfc 7 * 8 */ 9 public class SwapTwoNumber { 10 public static void main(String[] args) { 11 12 /* 1.第一种交换方式,位运算:^(异或) */ 13 System.out.printl

【C】辗转相除法求两个数的最大公约数,利用位运算交换两个数无须中间变量

辗转相除法,又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法.它是已知最古老的算法, 其可追溯至3000年前.这种算法,在中国则可以追溯至东汉出现的<九章算术>.设两数为a.b(a>b),求a和b最大公约数(a,b)的步骤如下:用a除以b,得a÷b=q......r1(0≤r1).若r1=0,则(a,b)=b:若r1≠0,则再用b除以r1,得b÷r1=q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r1除r2

异或交换两个数的陷阱【转】

前面我们谈到了,可用通过异或运算交换两个数,而不需要任何的中间变量. 如下面: void exchange(int &a, int &b) { a ^= b; b ^= a; a ^= b; } 然而,这里面却存在着一个非常隐蔽的陷阱. 通常我们在对数组进行操作的时候,会交换数组中的两个元素,如exchang(&a[i], &b[j]), 这儿如果i==j了(这种情况是很可能发生的),得到的结果就并非我们所期望的. void main() { int a[2] = {1, 

如何不使用第三个变量来交换两个数的值

最近在看<c++从入门到精通>自学c++,里面有一道课后题是如何做到不适用第三个变量来交换两个数的值,以下是我在网上查找到的资料,记录下并作为笔记. 题目:a=10,b=15,将a / b的值互换. 通常我们的做法是(尤其是在学习阶段):定义一个新的变量,借助它完成交换.代码如下:      int a,b;      a=10; b=15;      int t;      t=a; a=b; b=t;      这种算法易于理解,特别适合帮助初学者了解计算机程序的特点,是赋值语句的经典应用

c语言实现交换两个数的值

C语言中要实现交换两个数的值,可以有很多种方法,具体如下所述. 不使用中间变量: 1 // 异或, a^=b^=a^=b; 2 a ^= b; 3 b ^= a; 4 a ^= b; 5 6 // 加减 7 a = a + b; 8 b = a - b; 9 a = a - b; 10 11 // 乘除 12 a = a * b; 13 b = a / b; 14 b = a/ b; 使用中间变量: 1 // 需临时空间 2 temp = a; 3 a = b; 4 b = temp; 正如你所

java交换两个数的常见方法及效率测试

原文地址--http://blog.csdn.net/qq525099302/article/details/47294443 论两个数的交换的重要性 讨论交换两个数的方法对某些人来说无聊,但某些人很乐意探究,甚至某些面试官喜欢用这个做文章.刚出来找工作笔试的时候我也碰到与之相关的问题. 常见的两个数交换的方法 边赋值边运算 加减减交换 用中间变量交换 异或交换 下面是代码 public class Test { public static void main(String[] args) {