1. 质数判断
1.1 试除法
#include<bits/stdc++.h>
using namespace std;
int isprime(int x)
{
for(int i=2;i*i<=x;i++) //等号是必须的
{
if(x%i==0)
{
return 0; //表示x为合数
}
}
return 1;
}
int main()
{
int n;
cin>>n;
for(int i=2;i<=n;i++)
{
if(isprime(i)==1)
{
cout<<i<<' ';
}
}
return 0;
}
1.2 埃氏筛选
#include<bits/stdc++.h>
using namespace std;
int isprime[1000000]; //值为0表示为质数
int main()
{
int n;
cin>>n;
for(int i=2; i<=n; i++)
{
if(isprime[i]==0)
{
for(int j=i+i; j<=n; j+=i)
{
isprime[i]=1; //不是质数被枪毙掉
}
}
}
for(int i=2;i<=n;i++)
{
if(isprime[i]==0)
{
cout<<i<<' ';
}
}
return 0;
}
2. 最大公约数
2.1 辗转相除法,即欧几里得算法
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
cout<<gcd(10,15);
return 0;
}
2.2 两数相减
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
while(a!=b)
{
if(a>b)
{
a-=b;
}
else
{
b-=a;
}
}
return a;
}
int main()
{
cout<<gcd(10,15);
return 0;
}
3. 最小公倍数
3.1 辗转相除法
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b)
{
return b==0?a:gcd(b,a%b);
}
int lcm(int a,int b)
{
return a*b/gcd(a,b);
}
int main()
{
cout<<lcm(10,15);
return 0;
}
3.2 大数倍增法
#include<bits/stdc++.h>
using namespace std;
int lcm(int a,int b)
{
if(a<b)
{
swap(a,b);
}
while(a%b!=0)
{
a+=a;
}
return a;
}
int main()
{
cout<<lcm(10,15);
return 0;
}
4. 同余方程
#include<bits/stdc++.h>
using namespace std;
int m1(int a,int b,int c)//(a+b)%c
{
return (a%c+b%c)%c;
}
int m2(int a,int b,int c)//(a*b)%c
{
return (a%c*b%c)%c;
}
int main()
{
cout<<m1(3,5,2)<<endl;
cout<<m2(3,5,2);
return 0;
}
5. 杨辉三角
#include<bits/stdc++.h>
using namespace std;
int a[100][100];
void yhsj(int n)
{
a[1][1]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
a[i][j]=a[i-1][j-1]+a[i-1][j];//等于左上+上
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
int main()
{
yhsj(5);
return 0;
}
6. 二项式定理
6.1 排列
#include <bits/stdc++.h>
using namespace std;
long long A(int m,int n)
{
long long f=1;
for(int i=m;i>=m-n+1;i--)
{
f*=i;
}
return f;
}
int main()
{
cout<<A(6,3);
return 0;
}
6.2 组合
6.3 二项式定理
#include <bits/stdc++.h>
using namespace std;
long long A(int m,int n)
{
long long f=1;
for(int i=m;i>=m-n+1;i--)
{
f*=i;
}
return f;
}
long long C(int m,int n)
{
return A(m,n)/A(n,n);
}
int main()
{
cout<<C(5,2);
return 0;
}
#include <bits/stdc++.h>
using namespace std;
long long A(int m,int n)
{
long long f=1;
for(int i=m;i>=m-n+1;i--)
{
f*=i;
}
return f;
}
long long C(int m,int n)
{
return A(m,n)/A(n,n);
}
void exs(char a,char b,int n)
{
for(int i=0;i<=n;i++)
{
cout<<'+'<<C(n,i)<<a<<'^'<<n-i<<'*'<<b<<'^'<<i;
}
}
int main()
{
exs('a','b',2);
return 0;
}
7. 卡特兰数
#include <bits/stdc++.h>
using namespace std;
long long A(int m,int n)
{
long long f=1;
for(int i=m;i>=m-n+1;i--)
{
f*=i;
}
return f;
}
long long C(int m,int n)
{
return A(m,n)/A(n,n);
}
long long catalan(int n)
{
//return C(2*n,n)-C(2*n,n+1); //公式1
return C(2*n,n)/(n+1); //公式2
}
int main()
{
for(int i=0;i<=10;i++)
{
cout<<catalan(i)<<" ";
}
return 0;
}
8. 容斥原理