网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

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

#define _CRT_SECURE_NO_WARNINGS 1

网站建设哪家好,找创新互联公司!专注于网页设计、网站建设、微信开发、小程序制作、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了石屏免费建站欢迎大家使用!

#include

#include

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

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;

}


文章题目:不使用中间变量交换两个数.求平均数考虑溢出
文章起源:http://bjjierui.cn/article/jjpjhg.html

其他资讯