C語(yǔ)言中的奇技淫巧
前言
學(xué)習(xí)C語(yǔ)言的過(guò)程中,總會(huì)遇到很多令人眼前一亮的代碼,尤其是你寫(xiě)了幾十行的代碼,別人只用了簡(jiǎn)單幾行的遞歸就實(shí)現(xiàn)的功能。下面我就總結(jié)幾個(gè)C語(yǔ)言中 比較新手向的代碼。讓你有一種”woc!還能這么寫(xiě)!”的想法,二進(jìn)制 遞歸大神繞路。
第一種:遞歸類
求最大公因數(shù)
常規(guī)寫(xiě)法:
int gcd(int m, int n)
{
int r;
if (m>n){r=m,m=n,n=r;}
r=n%m;
while (r!=0){
n=m;
m=r;
r=n%m;
}
return m;
}
騷操作!–遞歸寫(xiě)法!
int gcd(int x, int y) {
return y?gcd(y,x%y):x;
}
第一次看到這個(gè)代碼,我的反應(yīng)是黑人問(wèn)號(hào)臉。臥槽?輾轉(zhuǎn)相除法,還能這么寫(xiě)?wtf
逆序輸出字符串
常規(guī)寫(xiě)法:
char *reverse(char *str)
{
if( !str ) //判斷輸入字符串是否為空串
{
return NULL; //若為空串則返回NULL
}
int len = strlen(str);
if( len > 1 )
{
char ctemp =str[0];
str[0] = str[len-1];
str[len-1] = '\0'; // 最后一個(gè)字符在下次遞歸時(shí)不再處理
reverse(str+1); // 遞歸調(diào)用
str[len-1] = ctemp;
}
return str;
}
遞歸寫(xiě)法!
void reverse(char *x)
{
if(*x){ //若該字符型變量為0(ascii碼值為0,不是數(shù)字'0')的字符則不進(jìn)入
fun(x+1); //遞歸調(diào)用
printf("%c",*x); //輸出單個(gè)字符
}
}
這樣寫(xiě)是不是有點(diǎn)棧的味道!
第二種:二進(jìn)制!
交換兩個(gè)變量的值
常規(guī)寫(xiě)法:
int temp = a; a = b; b = temp;
三行代碼,用到一個(gè)中間值。那么用二進(jìn)制中的異或可以不使用第三個(gè)值,并且只有一行代碼。
使用二進(jìn)制的寫(xiě)法:
a ^= b ^= a ^= b;
具體兩者的時(shí)間復(fù)雜度,沒(méi)有深入的了解。
統(tǒng)計(jì)變量二進(jìn)制中 ‘1' 的個(gè)數(shù)
常規(guī)寫(xiě)法:
int v; //被計(jì)算的變量
int count=0; //計(jì)算二進(jìn)制中‘1'的個(gè)數(shù)
while(v != 0){
if(v%2 ==1)
count++;
v /= 2;
}
將被統(tǒng)計(jì)的變量對(duì)2求余,如果余數(shù)為1則count加一。
使用二進(jìn)制的寫(xiě)法:
int v=9; //被統(tǒng)計(jì)的變量
int count; //統(tǒng)計(jì)二進(jìn)制中‘1'的個(gè)數(shù)
for(count=0; v; count++) {
v &= v-1;
}
利用二進(jìn)制操作符的特性,操作二進(jìn)制能讓方法變得更加簡(jiǎn)單合理。
To be continue…
相關(guān)文章
C語(yǔ)言簡(jiǎn)明講解類型轉(zhuǎn)換的使用與作用
類型轉(zhuǎn)換(type?cast),是高級(jí)語(yǔ)言的一個(gè)基本語(yǔ)法。它被實(shí)現(xiàn)為一個(gè)特殊的運(yùn)算符,以小括號(hào)內(nèi)加上類型名來(lái)表示,接下來(lái)讓我們一起來(lái)詳細(xì)了解2022-04-04
C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息
這篇文章主要介紹了C++ Custom Control控件向父窗體發(fā)送對(duì)應(yīng)的消息的相關(guān)資料,需要的朋友可以參考下2015-06-06
基于matlab實(shí)現(xiàn)DCT數(shù)字水印嵌入與提取
數(shù)字水印技術(shù)是將一些標(biāo)識(shí)信息直接嵌入數(shù)字載體當(dāng)中,?或間接表示在信號(hào)載體中,?且不影響原載體的使用價(jià)值。本文主要為大家介紹了基于matlab如何實(shí)現(xiàn)數(shù)字水印的嵌入與提取,感興趣的可以學(xué)習(xí)一下2022-01-01
Opencv二幀差法檢測(cè)運(yùn)動(dòng)目標(biāo)與提取輪廓
這篇文章主要為大家詳細(xì)介紹了Opencv使用二幀差法檢測(cè)運(yùn)動(dòng)目標(biāo)與提取輪廓,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03
C++中的結(jié)構(gòu)體vector排序問(wèn)題
這篇文章主要介紹了C++中的結(jié)構(gòu)體vector排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

