演算法中的一些實用技巧
阿新 • • 發佈:2019-01-05
一、組合數的計算:
C(n,m) = n! / ((n-m)! * m!)(m ≤ n)
long long C(int n, int m)
{
if(m < n - m){
m = n - m;
}
long long ans = 1;
for(int i = m + 1;i <= n;i++){
ans *= i;
}
for(int i = 1;i <= n - m;i++){
ans /= i;
}
return ans;
}
二、素數的判定:
int is_prime(int n) { if(n <= 1){ return 0; } int m = floor(sqrt(n) + 0.5); for(int i = 2;i <= m;i++){ if(n % i == 0){ return 0; } } return 1; }
三、用函式交換變數(指標作引數):
#include <stdio.h>
void swap(int* a,int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int main()
{
int a = 3, b = 4;
swap(&a, &b);
printf("%d %d\n",a, b);
return 0;
}
錯誤寫法①:
void swap(int* a,int* b)
{
int *t = a;
a = b;
b = t;
}
原因:
錯誤寫法②:
void swap(int* a,int* b)
{
int *t;
*t = *a
*a = *b;
*b = *t;
}
原因:t是一個變數(指標也是一個變數,只不過型別是“指標”),根據規則,它在賦值之前是不確定的。如果這個“不確定的值”所代表的記憶體單元恰好是能寫入的,那麼這段程式將正常工作;但如果它是隻讀的,程式可能會崩潰。