演算法 演算法的藝術(五)

2022-05-06 18:09:15 字數 2731 閱讀 4840

利用位運算求整數的原碼或補碼

利用位運算求任意整數的原碼或補碼。

例項解析:

整數在記憶體中本來就是用補碼存放的,若要求出補碼,只需求出記憶體中的每一位二進位制數即可。而原碼,若是負數,則需要將補碼減1然後取反(最高位不取反)。

程式**:

#include "stdio.h"

int main()

while(k != 『1』 && k != 『2』);

if(k == 『1』 && n<0)

printf("\n");

getch();

return 0;

}

字串逆置

編寫乙個函式,可將字串逆置。

例項解析:

函式的功能是將字串逆置(頭變成尾,尾變成頭),而不是把字串倒序輸出。例如:字串本來是abcde,逆置後記憶體中的字串變為edcba。

要將字串逆置,需要將第乙個字元與最後乙個字元交換,第二個與倒數第二個交換……,設字串有效字元個數為n,則這樣的交換要進行n/2次。

程式**:

#include void reverse(char *p)

}

用遞迴法逆序輸出字串

編寫乙個函式,可將字串逆序輸出。

例項解析:

逆序輸出,僅僅是倒著輸出字串,並不是要改變記憶體中字串的儲存狀態。

結束遞迴的條件是:給定的字串是空串。

程式**:

void  reverse(char *str)

}

用遞迴法對陣列排序

編寫乙個函式,實現用遞迴法對整型陣列排序。

例項解析:

用遞迴法排序不需要考慮所有的數,在函式中只需要把最大(最小)的數找出並交換到最前面,剩下數的排序由下乙個「自己」去完成。當待排序的資料只剩乙個時結束遞迴。

程式**:

void sort(int *p, int n)  //p用來儲存陣列首位址,n為資料個數

}

附主函式:

int main()

;   clrscr();

sort(a, 10);

for(i = 0; i <= 9; i++)

printf("%3d", a[i]);

getch();

return 0;

}

向主調函式中的區域性變數存資料

主函式中輸入乙個字串,並定義了乙個區域性變數num用來統計字串中字母的個數,請在被調函式中統計字母的個數並由被調函式存入num中。

例項解析:

(1) 被調函式要統計字母個數,須知道字串的存放位置,故需將陣列位址傳遞給被調函式。

(2) num是主調函式的區域性變數,被調函式中不能直接訪問,若要把統計結果存入num中,必須通過指標變數間接訪問,因此又需要傳遞num的位址。

int main()

void count(char *str, int *p)

通過指標變數使函式「返回」兩個值

編寫乙個函式,可用來求兩個整數的平方差和平方和。

例項解析:

題目要求平方差和平方和兩個值,卻只允許編寫「乙個」函式,而乙個函式只能返回乙個值,所以必須借助於全域性變數或指標變數完成。可以採用以下四種方法來實現:

設兩個全域性變數分別用來儲存平方差和平方和,被調函式直接向全域性變數存值,函式不需要返回值

設乙個全域性變數,乙個區域性變數。被調函式將乙個值直接存入全域性變數,另乙個值返回,由主調函式將返回值存入區域性變數。

設兩個區域性變數,被調函式通過指標變數將值存入區域性變數。

設兩個區域性變數,乙個通過指標變數賦值,另乙個通過返回值賦值。

對於全域性變數,最好不用,這樣我們只能在3、4兩種方法中選一種,鑑於方法3對兩個變數的處理方法一致,程式設計相對簡單,故我們選用方法3。

void sum_sub(int x, int y, int *p1, int *p2)

int main()

本題借助於指標變數使得被調函式計算出的兩個值存入了主調函式的兩個變數中,但是這兩個值不是返回的,而是在被調函式中存入的。

利用位運算對字母進行大小寫轉換

程式設計,用位運算實現字母大小寫的轉換:若是大寫,轉為小寫,若為小寫,則轉為大寫。

例項解析:

大寫字母和小寫字母的區別是:大寫字母二進位制ascii碼的第6位(最右邊為第0位)是0,而小寫字母則為1,例如』a』的ascii碼是 01000001,』a』的ascii碼則是 01100001。要實現大寫變為小寫,只需把此位的0改為1,反之,則把1改為0。

將某位由0變1可使用位操作「|」,將某位由1變0則用「&」。

void change(char *p)

附:主函式

int main()

利用位操作實現大小寫轉換比用c += 32或c -= 32執行速度更快(只需要改變記憶體中的1位),這也正是ascii碼表中將小寫字母排在97之後而不是緊接著大寫字母的原因。

本題還有一種更簡單方法:直接與32異或。

void change(char *p)

本文出自 「成鵬致遠」 部落格,請務必保留此出處

演算法 演算法的藝術

小續 最近很多人都在問我資料結構和演算法的相關問題,對於初學者,貌似聽到演算法,資料結構什麼的,都覺得是比較高深的東西,其實它們並沒有想象中的難,只是你還沒有乙個整體上的把握,還沒有習慣站在整體上去思考問題。演算法是靈魂,資料結構是包裝,語言只是工具,學什麼語言並不重要,重要的是思想。這也是如鵬的理...

演算法 演算法的藝術(三)

列印魔方陣 乙個奇數階 設為n階 的方陣,將1 2 3 n2填入方陣中,使每行 每列資料之和都相等,這樣的方陣便是魔方陣。例項解析 填寫魔方陣有乙個固定的方法 1 1總是位於第一行的中間。3 若右上方超出 的右邊界,則數字填入到第一列,行數不變。圖16 1中的3和8都是這種情況。若右上方超出上邊界,...

演算法 演算法的藝術(三)

列印魔方陣 乙個奇數階 設為n階 的方陣,將1 2 3 n2填入方陣中,使每行 每列資料之和都相等,這樣的方陣便是魔方陣。例項解析 填寫魔方陣有乙個固定的方法 1 1總是位於第一行的中間。3 若右上方超出 的右邊界,則數字填入到第一列,行數不變。圖16 1中的3和8都是這種情況。若右上方超出上邊界,...