C語言中的奇技淫巧
前言
學(xué)習(xí)C語言的過程中,總會(huì)遇到很多令人眼前一亮的代碼,尤其是你寫了幾十行的代碼,別人只用了簡單幾行的遞歸就實(shí)現(xiàn)的功能。下面我就總結(jié)幾個(gè)C語言中 比較新手向的代碼。讓你有一種”woc!還能這么寫!”的想法,二進(jìn)制 遞歸大神繞路。
第一種:遞歸類
求最大公因數(shù)
常規(guī)寫法:
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; }
騷操作!–遞歸寫法!
int gcd(int x, int y) { return y?gcd(y,x%y):x; }
第一次看到這個(gè)代碼,我的反應(yīng)是黑人問號臉。臥槽?輾轉(zhuǎn)相除法,還能這么寫?wtf
逆序輸出字符串
常規(guī)寫法:
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; }
遞歸寫法!
void reverse(char *x) { if(*x){ //若該字符型變量為0(ascii碼值為0,不是數(shù)字'0')的字符則不進(jìn)入 fun(x+1); //遞歸調(diào)用 printf("%c",*x); //輸出單個(gè)字符 } }
這樣寫是不是有點(diǎn)棧的味道!
第二種:二進(jìn)制!
交換兩個(gè)變量的值
常規(guī)寫法:
int temp = a; a = b; b = temp;
三行代碼,用到一個(gè)中間值。那么用二進(jìn)制中的異或可以不使用第三個(gè)值,并且只有一行代碼。
使用二進(jìn)制的寫法:
a ^= b ^= a ^= b;
具體兩者的時(shí)間復(fù)雜度,沒有深入的了解。
統(tǒng)計(jì)變量二進(jìn)制中 ‘1' 的個(gè)數(shù)
常規(guī)寫法:
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ì)的變量對2求余,如果余數(shù)為1則count加一。
使用二進(jìn)制的寫法:
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)制能讓方法變得更加簡單合理。
To be continue…
相關(guān)文章
c++調(diào)用動(dòng)態(tài)庫LNK2019和LNK1120無法解析的外部命令
本文主要介紹了c++調(diào)用動(dòng)態(tài)庫LNK2019和LNK1120無法解析的外部命令, 出現(xiàn)這個(gè)錯(cuò)誤一般都是函數(shù)只找到聲明但沒有實(shí)現(xiàn),或者是少了什么鏈接庫,下面就來解決一下2024-06-06內(nèi)聯(lián)函數(shù)inline與宏定義深入解析
類的內(nèi)斂函數(shù)是一個(gè)真正的函數(shù)。使用內(nèi)聯(lián)函數(shù)inline可以完全取代表達(dá)式形式的宏定義2013-09-09C語言每日練習(xí)之動(dòng)態(tài)顯示系統(tǒng)時(shí)間
這篇文章主要介紹了C語言動(dòng)態(tài)顯示系統(tǒng)時(shí),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-11-11C++11右值引用和移動(dòng)語義的實(shí)例解析
左值和右值都是針對表達(dá)式,左值是指表達(dá)式結(jié)束后依然存在的持久對象,右值是指表達(dá)式結(jié)束時(shí)就不再存在的臨時(shí)對象,下面這篇文章主要給大家介紹了關(guān)于C++11右值引用和移動(dòng)語義的相關(guān)資料,需要的朋友可以參考下2022-09-09C++ abs函數(shù)實(shí)際應(yīng)用詳解
本文我們來講C++的abs函數(shù)以及實(shí)戰(zhàn)運(yùn)用,C++中的abs函數(shù)。在C++中使用abs函數(shù)要注意存在兩種版本,一種是在stdlmb.h中定義的版本,另一個(gè)是在cmath頭文件中定義的。夷實(shí)上在stdlib.h文件是C的函數(shù),而cmath中的是C++版本2022-08-08