#define _CRT_SECURE_NO_WARNINGS 1
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序制作、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了石屏免費(fèi)建站歡迎大家使用!
#include<stdio.h>
#include<stdlib.h>
//不使用中間變量交換兩個(gè)數(shù)的值
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);//當(dāng)兩個(gè)數(shù)有一個(gè)0或者都為0時(shí)就不再適用
③* a = *a ^*b; //把*a和*b中所有的不同位拿出來
* b = *a ^*b; //因?yàn)檫@時(shí)候*a中保存的是*a和*b的不同位,所以再異或*b就把最初的*a拿出來
* a = *a ^*b;//同理,因?yàn)?b已經(jīng)是最初的*a,所以兩個(gè)數(shù)不同位再異或*b就將最初*b拿出來了
}
int main()
{
int a = 0, b = 0;
scanf( "%d%d" , &a, &b);
exchange_num(&a,&b); //因?yàn)樾螀⒅皇且环菖R時(shí)拷貝,所以進(jìn)行“址”傳遞
printf( "a=%d,b=%d" , a, b);
system( "pause" );
return 0;
}
//求兩個(gè)數(shù)的平均值,考慮溢出
int average(int a, int b)
{
int ret = 0;
① ret = ( a + b )>>1;
//當(dāng)a,b都特別大的時(shí)候,a+b有可能會產(chǎn)生溢出的危險(xiǎn),所以一般我們用下面這三種方法,來求兩個(gè)數(shù)的平均數(shù)
②ret = a + (b - a)>> 1;
③ret = b + (a - b)>>1;
④ret = ( a &b )+((a^b)>>1);
return ret;
//我們知道,十進(jìn)制的兩個(gè)數(shù)求和,等于其對應(yīng)的二進(jìn)制求和。a&b:是將a和b的相同位拿出來,a^b是將a和b不同的位拿出來。當(dāng)我們在求平均值時(shí),兩個(gè)二進(jìn)制相加再除以2就是所求的平均值,而相同的位加起來再除以2相當(dāng)于沒有改變,所以依然是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;
}
當(dāng)前題目:不使用中間變量交換兩個(gè)數(shù).求平均數(shù)考慮溢出
網(wǎng)址分享:http://aaarwkj.com/article46/jjpjhg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、云服務(wù)器、自適應(yīng)網(wǎng)站、商城網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站營銷
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)