文章内容主要参考刘汝佳著作《算法竞赛入门经典》(第2版)
计算组合数![这里写图片描述](https://img-blog.csdn.net/20171001115809320?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2NudWFjbWhkdQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
一般思路(计算范围太小,容易溢出):
#include<iostream>
using namespace std;
long long factorial(int n)
{
long long ans=1;
for(int i=1;i<=n;i++)
ans*=i;
return ans;
}
int main()
{
int n,m;
cin>>n>>m;
cout<<factorial(n)/(factorial(m)*factorial(n-m))<<endl;
return 0;
}
优化算法:n!/m!先这么消掉一个m!
#include<iostream>
using namespace std;
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 main()
{
int n,m;
cin>>n>>m;
cout<<C(n,m)<<endl;
return 0;
}
判断素数
代码一:
//n=1或n比较大时不能用
bool is_prime(int n)
{
for(int i=2;i*i<=n;i+=(i==2)?1:2)
if(n%i==0) return false;
return true;
}
代码二:
bool is_prime(int n)
{
if(n<=1)return false;
for(int i=2;i<=sqrt(n+0.5);i+=(i==2)?1:2)
if(n%i==0) return false;
return true;
}
用函数交换两个变量的值
//不能实现两数交换
void swap1(int a,int b)
{
int t;t=a;a=b;b=t;
}
void swap2(int *a,int *b)
{
int t=*a;*a=*b;*b=t;
}
void swap3(int &a,int &b)
{
int t=a;a=b;b=t;
}
//不能实现交换
void swap4(int *a,int *b)
{
int *t=a;a=b;b=t;
}
//出现野指针t,可能会产生意想不到的错误
void swap5(int *a,int *b)
{
int *t;
*t=*a;*a=*b;*b=*t;
}
关于sizeof的补充
#include<iostream>
#include<cmath>
using namespace std;
int sum(int a[])
{
int ans=0;
cout<<sizeof(a)<<endl;//此语句算出的结果是4,即传递的地址的大小
//用函数传递进来的是个地址,sizeof(a)不是数组的长度
for(int i=0;i<sizeof(a);i++)
ans+=a[i];
return ans;
}
int main()
{
int a[34]={3,3,3,4,2};
cout<<sizeof(a)<<endl;
//将求出前4个元素的和
cout<<sum(a)<<endl;
return 0;
}
求左闭右开区间内的元素的和
int sum(int *begin,int *end){
int ans=0;
for(int *p=begin;p!=end;p++){
ans+=*p;
}
return ans;
}
递归求阶乘
int f(int n){
if(n==0)return 1;
return f(n-1)*n;
}