C語言習題 練習1

2021-10-10 08:36:20 字數 2905 閱讀 3644

2.列印整數二進位制的奇數字和偶數字

3.統計二進位制中1的個數

4 交換兩個變數(不建立臨時變數)

5.喝汽水問題

程式設計實現:兩個int(32位)整數m和n的二進位制表達中,有多少個位(bit)不同?

輸入例子:

1999 2299

輸出例子:7

(1) 先將m和n進行按位異或,此時m和n相同的二進位制位元位清零,不同的二進位制位元位為1

(2) 統計異或完成後結果的二進位制位元位中有多少個1即可

這裡統計乙個數中1的個數的方法兩種

第一種很容易想到,將數迴圈右移1位直到數為零,每次與1相與,結果為真表示該位為1。但是這種方法需要注意使用無符號型別,不然左邊空位會補符號位1

用unsigned型別是為了保證數在右移時,無論該程式在什麼機器上執行,左邊空出的位都用0而不是符號位填補。

第二種方法比較巧妙利用x&=(x-1)這個式子每次消除x中最右邊值為1的二進位制位,迴圈次數即為1的個數。

我們隨便為x-1選乙個值,比如二進位制1010,x就為1011,x&=(x-1),x為1010

x-1為1001,x&=(x-1),x為1000,

x-1為0111,x&=(x-1),x為0,

迴圈三次,1011中共3個1,

我們發現x-1最右端為0的位與x最右端為1的位相對應,

兩者相與,x&(x-1)就能消除x最右端值為1的位。

//1.求兩個數二進位制中不同位的個數

intcalc_dif_bit

(int m,

int n)

// tmp >>= 1;

// //}

//方法2

int tmp = m^n;

int count =0;

while

(tmp)

return count;

}int

main()

system

("pause");

return0;

}

獲取乙個整數二進位制序列中所有的偶數字和奇數字,分別列印出二進位制序列

(1)提取所有的奇數字,如果該位是1,輸出1,是0則輸出0

(2) 以同樣的方式提取偶數字置

檢測num中某一位是0還是1的方式:

(1) 將num向右移動i位

(2)將移完位之後的結果與1按位與,如果:

結果是0,則第i個位元位是0

結果是非0,則第i個位元位是1

//2.列印整數二進位制的奇數字和偶數字

void

printbit

(int num)

printf

("\n");

printf

("偶數字: ");

for(

int i =

30; i >=

0; i-=2

)printf

("\n");

}int

main()

寫乙個函式返回引數二進位制中 1 的個數。

比如: 15 0000 1111 4 個 1

牛客網oj鏈結

該題思路可以參考第一題的思路,兩種方法:按位與1(注意符號)或者按位與它本身-1。

採用相鄰的兩個資料進行按位與運算

舉例:9999:‭10 0111 0000 1111‬

第一次迴圈:n=9999 n=n&(n-1)=9999&9998= 9998

第二次迴圈:n=9998 n=n&(n-1)=9998&9997= 9996

第三次迴圈:n=9996 n=n&(n-1)=9996&9995= 9992

第四次迴圈:n=9992 n=n&(n-1)=9992&9991= 9984

第五次迴圈:n=9984 n=n&(n-1)=9984&9983= 9728

第六次迴圈:n=9728 n=n&(n-1)=9728&9727= 9216

第七次迴圈:n=9216 n=n&(n-1)=9216&9215= 8192

第八次迴圈:n=8192 n=n&(n-1)=8192&8191= 0

可以觀察下:此種方式,資料的二進位制位元位中有幾個1,迴圈就迴圈幾次,而且中間採用了位運算,處理起來比較高效

//3.統計二進位制中1的個數

intcalcbit

(int num)

tmp >>=1;

}方法2

//int count = 0;

//while (num)

//return count;

}int

main()

system

("pause");

return0;

}

不允許建立臨時變數,交換兩個整數的內容

使用異或操作,異或操作滿足結合律

a=a^b

b=a^b 即:b=a ^ b ^ b =a

a=a^b 即:a=a ^ b ^ b =a

int

main()

喝汽水,1瓶汽水1元,2個空瓶可以換一瓶汽水,給20元,可以多少汽水(程式設計實現)。

(1)20元首先可以喝20瓶,此時手中有20個空瓶子

(2)兩個空瓶子可以喝一瓶,喝完之後,空瓶子剩餘:empty/2(兩個空瓶子換的喝完後產生的瓶子) + empty%2(不夠換的瓶子)

(3) 如果瓶子個數超過1個,可以繼續換,即重複2

int

main()

printf

("%d\n"

, total)

;return0;

}

c語言練習題1

1 編寫乙個程式實現求圓形的面積,使用者自己輸入半徑?s pi r r include define pi 3.14 int main int argc,const char argv 2 編寫乙個遞迴函式,求乙個整數的2進製形式。include void calc int n int main i...

C語言基礎習題練習1

1 輸入乙個三位正整數n,輸出其個位 十位和百位上的數字。程式 如下 include main 2 從鍵盤上輸入乙個小寫字母,在螢幕上輸出其對應的大寫字母。程式 如下 include main ch ch 32 printf 對應的大寫字母為 c ch 3 編寫乙個程式,從鍵盤輸入圓錐體的半徑r和高...

C語言練習題1

1 隨機函式 產生四個0 9之間的數字,不是產生乙個四位數 a.srand unsigned time null 以當前時間為準,設定隨機種子 注意 此函式,在每次開始遊戲後呼叫一次即可 b.rand 注意 rand 函式,每呼叫一次,產生乙個隨機數字以上所需標頭檔案 include srand r...