熟練使用程式設計小技巧

2021-10-06 22:00:21 字數 1335 閱讀 4887

有一些程式設計的小技巧想要分享給大家,後續還會繼續更新,與大家一起學習。

if (n & 1) // 判斷乙個數是否為奇數
n = n & (n - 1) // 消除n的二進位製碼中的最後乙個1
例如:判斷乙個數的二進位製碼中有多少個一,我們就可以用這種方法。

int count = 0;

while (n)

printf("%d\n", count);

n & (-n)  等同於  n & (~n + 1) // 判斷n最多能被幾整除,這個數為2的x次方。
例如:求c(2n,1) , c(2n,3) , ... , c(2n,2n-1) 的最大公約數是多少。其中c(m,n) =這裡我們要知道兩個數學原理,一、求a和b的最大公約數,假設a>b,等於求a和(a-b)的最大公約數,同理求a和b的最大公約數也等於求a和(a+b)的最大公約數。二、c(n,1) + c(n,2) + c(n,3) + ... + c(n,n) = 2^n。其中奇數項之和等於偶數項之和為2^(n-1)

根據這兩個原理我們可以知道c(2n,1)與c(2n,3) ... 以及 c(2n,2n-1)之和為2n^(n-1),他們的最大公約數等同於求c(2n,1)和c(2n,1)+c(2n,3)+ ... +c(2n,2n-1)的最大公約數。即2n與(2n)^(n-1)的最大公約數,即求2n最多能被2的幾次方整除。

bitmap   我們知道乙個int型整數只能表示乙個數,它要佔4個位元組,32個bits。通過bitmap這種方法可以讓乙個int型整數表示32個數。原理是讓每乙個二進位制數表示乙個數字。具體來說有點像hash的原理,建立乙個int型陣列,假設int a[10]= ;a[0]表示0~31中的數字是否出現,a[1]表示32~63, a[2]表示64~95,以此類推。我們假設出現的數字有1,3,4,6,9,31。那麼a[0]的二進位制表示就應該為10000000000000000000001001011010。也就是說出現乙個數字我們就讓對應的二進位製碼的位置置1。具體操作方法是

set(i)   arr[(i)>>0x5] |= (0x1 << ((i) & 0x31))  // 通過除以32判斷它在哪個陣列中,

//通過與31相與確定它在陣列中的值,通過1的左移可以將對應位置的二進位製碼置1。

//最後通過異或的方式將每乙個數字表示出來

那麼如何判斷該數字是否存在呢

get(i)  ((arr[(i) >> 0x5]) >> ((i) & 0x1f) & 0x1) // 判斷數字所對應位置的二進位製碼是否置一

程式設計小技巧

define conn x,y x y define tochar x x define tostring x x x y表示什麼?表示x連線y,舉例說 int n conn 123,456 結果就是n 123456 char str conn asdf adf 結果就是 str asdfadf 怎...

程式設計小技巧

1.如何通過輸入一組任意長度的數字序列?char inchar n int num n int i 0 int len 0 scanf s inchar len strlen inchar printf len d len for i 0 i 2.scanf gets 與getchar 的區別 ge...

程式設計小技巧

1 判斷奇數 if n 0x1 或用用 x 2 0,不要用 x 2 1,因為x可能是負 數。2 在判斷兩個浮點數 a 和 b 是否相等時,不要用 a b,應該判斷二者之差的絕對值 fabs a b 是否小於某個閾值,例如 1e 9 3 用 char 的值作為陣列下標 例如,統計字串中每個字元出現的次...