不使用中间变量交换两个数.求平均数考虑溢出-创新互联-成都快上网建站

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

#define _CRT_SECURE_NO_WARNINGS 1

成都创新互联是一家专业提供东辽企业网站建设,专注与做网站、网站设计H5高端网站建设、小程序制作等业务。10年已为东辽众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。

#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;

}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


名称栏目:不使用中间变量交换两个数.求平均数考虑溢出-创新互联
网页URL:http://kswjz.com/article/dogsgh.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流