不使用中间变量交换两个数. 求平均数考虑溢出
2016-05-12 23:28
260 查看
#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;
}
#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;
}
相关文章推荐
- poj2758 checking the text
- “说反话”实现字符串反转
- 【程序人生】:一篇关于编程思想的体会
- 8、Hibernate框架(ORM详解、主文件配置、映射文件配置)
- 学生成绩统计(C案例)
- 浮点数的存储形式
- C++ MySQL存储二进制数据
- 哲学的初步认识9
- PopupWindow从上弹出
- windows下solrcloud+jetty+内嵌zookeeper伪集群环境搭建
- 剑指offer—数组中只出现一次的数字
- 可变参数列表
- 实验八:SQLite数据库操作
- 【BZOJ3878】[Ahoi2014]奇怪的计算器【线段树】
- sort
- 通过服务来下载APK,并在通知栏显示下载进度(两种方式)
- 内存操作函数
- jQuery 插件
- js 前加感叹号是什么意思?比如 !function(){}(); 答案在这里
- 递归入门 杭电 2042