原 C C 兩個小題目

2022-05-24 23:21:12 字數 1834 閱讀 7943

這周延續了上週的低迷——重感冒,而且非常鬱悶,因為有件事自己做得很努力卻依然沒有結果,沒戲了,無奈,迷茫,路在何方?——一如**的持續低迷……

忽然想起來自己最近看的理論性的東西居多,動手能力可能有所下降,就找了兩道c/c++(其實主要還是c,因為——後面就會看到)的小題目來練練手,果然,吭哧幹了將近4個小時,才算搞定這兩題。

1、給定乙個unsigned int數n,寫乙個函式計算其二進位制中「1」的個數(n=0,則結果為0,n=1則結果為1,n=5則結果為2)。函式原型為:int countbits(unsigned int n);假定在32-bit機器上執行。

乍一看,也忒簡單了:

int countbitswithstl(unsigned int n)

哈哈,順利完成!然後後續的問題又來了:不能使用stl!於是,憋了半天,想到了移位操作和mod。當乙個數的二進位制末位為0,則該數mod 2的結果永遠是0,所以只要n % 2 != 0就表示末位是1。算完末位之後,將n右移一位,在計算n % 2,依次類推,直到n為0,因此可以寫出:

int countbits(unsigned int n)

return count;

}看來也不難。後面又有一句:嘗試使用最少的迴圈。暈!思來想去不知道怎麼解答。這裡面的迴圈次數已經夠少了,最多才32次。不知道那位大蝦有好辦法指點一下——據說可以使用查詢表,以空間來換取時間。如果查詢表已經populated,存放在bits中,那麼簡單了:

int countbitslookuptable(unsigned int n, int bits)

不知道對不對……

2、反轉乙個字串,使用c語言。由於使用c語言,c++字串的那些東東就沒法用了!不過還是難不倒我,隨手就來——先把這個字串從尾到頭拷貝到臨時空間,然後再拷貝回來:

char * reversestringslow(char * astr)

strncpy(astr, ptemp, len);

free(ptemp);

return astr;

}注意這裡起的名字,這說明這個函式還有改進的可能。乙個演算法的兩個特性是時間、空間。這個函式既佔空間(多用len個位元組),又費時間(2 * len次迴圈,因為strncpy也是迴圈,還得考慮函式呼叫的開銷)。當然,在現在的pc上這些根本就可以忽略不計。然而,在資源非常有限的手持裝置上,影響比較顯著。在實時系統上更甚,尤其是len非常大的時候。 於是仔細想了想,我可以根據對稱性來交換字元——因為「abcde」反轉相當於「a」和「e」對調,「b」和「d」對調,「c」保持不動。那麼可以把字串分成兩半,依照對稱性對調就ok了。於是得出了下面這個:

char * reversestringfast(char * astr)

return astr;

}這時,只需要額外的乙個位元組,迴圈次數也變成了len/2次,快了不少啊。再往下看題:現在不要考慮其他,用c,遞迴方式反轉。開始頭大了……

想了好久也沒有眉目——也許是被前兩個函式的原型給束縛住了思維吧,實在忍不住了,上網查了一下,居然沒有合適的——他們都是直接在reverse時輸出,舊的字串依然保持原來的順序。不過看了一些之後,思路有些開啟了——我改一下函式原型不就簡單多了嗎?如:

void reversestringrecursively(char * begin, char * end);

如此一來,就好辦多了:

void reversestringrecursively(char * begin, char * end)

總算是完成了~~~ 看來我這基本功還有待歷練啊!對於自己的信心確實是乙個不小的打擊。這兩道題雖然簡單,但深究起來,還是有不少東西值得琢磨的。

ps:在reversestringslow()中沒有釋放記憶體,居然沒有人提到這個問題……還是我自己發現給改回來了。

乙個小題目

看到一道題目,自己嘗試了一下 編寫乙個在1,2,9 順序不能變 數字之間插入 或 或什麼都不插入,使得計算結果總是100的程式,並輸出所有的可能性。例如 1 2 34 5 67 8 9 100.首先要考慮所有的可能性,每兩個數字間有3種可能,一共有3的8次方種可能。這樣就能通過遍歷實現。void v...

原型的乙個小題目

題目要求 建立乙個shape物件,該物件有乙個type屬性和gettype 方法 定義乙個原型為shape的 建構函式,用 建立的物件應有三個物件屬性 a b c,分別用於表示三角形的三條邊 在物件原型中新增乙個名為getperimeter 的新方法,用下面的 來進行測試 var t new 1,2...

0904 兩個小題目 二分查詢和楊氏矩陣查詢

二分查詢 十分簡單,但程式設計珠璣上的說不要掉以輕心,so,寫下來,以防萬一 int binary search int a,int low,int high,int num 楊氏矩陣查詢問題 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞 增的順序排序。請完成乙個函式...