一、最大公约数。
//gcd()
int gcd(int a,int b){
if(b == 0) return a;
else return gcd(b,a%b);
}
//非递归形式:
int gcd(int a,int b){
int tmp;
while(b!=0){
tmp = a;
a = b;
b = tmp%b;
}
return a;
}
二、最小公倍数。
//lcm()
int lcm(a,b){
int d = gcd(a,b);
return (a/d)*b;
}
三、素数
bool isPrime(int n){
if(n<=1) return false;
int limit = (int)sqrt(n);
for(int i = 2;i<=limit;i++){
if(n%i == 0) return false;
}
return true;
}
//素数筛法
const int maxn = 1000;
int prime[maxn];
int mark[maxn]={0};
int num =0;
void getprime(){
for(int i =2;i<maxn;i++){
if(mark[i] == 0){
prime[num++] = i;
for(int j = i+i;j<maxn;j +=i){
mark[j] = 1;
}
}
}
}
四、质因子分解
struct factor{
int x,cnt;//x 质因子 cnt 个数
}fac[10];//十个就够了
int findzhi(int n){
int i = 0;
int sqr = (int) sqrt(n);
for(int i =0;i<pNum&&prime[i]<=sqrt;i++){
if(n%prime[i] == 0){
fac[i].x = i;
fac[i].cnt = 0;
while(n%prime[i] == 0){
fac[i].cnt++;
n/=prime[i];
}
}
}
}
五、哈夫曼树
priority_queue <int, vector<int>,greater<int>> huff;
int main(){
int n;
int x,y,tmp,ans =0;
for(int i =0;i<n;i++){
cin >>tmp;
huff.push(tmp);
}
while(huff.size() > 1){
x = huff.top();
huff.pop();
y = huff.top();
huff.pop();
huff.push(x+y);
ans += x+y;
}
cout << ans<< endl;
return 0;
}
六 最小生成树:kruskal:
struct edge{
int u,v;
int cost;
bool operator <(const edge & a)const{
return cost<a.cost;
}
}E[MAXE];
int father[MAXE]; // find the union
int findfather(int x){
int a = x;
while(x!=father[x])
x = father[x];
//zip road
while(a != father[a]){
int tmp =a;
a= father[a];
father[tmp] = x;
}
return x;
}
//kruskal
int kruskal(int n,int m){ // n-->node m-->edge
int ans =0; Num_edge = 0;
for(int i =0;i<n;i++){
father[i] = i;
}
sort(E,E+m);
for(int i =0;i<m;i++){
int faU = findfather(E[i].u);
int faV = findfather(E[i].v);
if(faU != faV){
father[faU] = faV; // union the edge
ans += E[i].edge;
Num_edge++;
if(Num_edge == n-1) return ans;
}
}
return -1;
}