目录
一、组合数的计算:
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;
}
原因:此写法交换了swap函数的局部变量a和b(辅助变量t必须是指针。int t = a是错误的),但却始终没有修改它们指向的内容,因此main函数中的a和b不会改变。
错误写法②:
void swap(int* a,int* b)
{
int *t;
*t = *a
*a = *b;
*b = *t;
}
原因:t是一个变量(指针也是一个变量,只不过类型是“指针”),根据规则,它在赋值之前是不确定的。如果这个“不确定的值”所代表的内存单元恰好是能写入的,那么这段程序将正常工作;但如果它是只读的,程序可能会崩溃。