算法中的小技巧

  1. 求一个数的幂次方,除了递归,还有更高效方法即快速幂方法
#include<iostream>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<stdlib.h>
using namespace std;
long long exp1(long long x,long long n){
    long long y=1;
        while(n>0){
            if(n&1!=0) y*=x%1000;
                n>>=1;
                x*=x%1000; 
            }
    return y%1000;
}
long long exp(long long x,long long n){
    long long y=1;
        while(n>0){
            if(n&1!=0) y*=x;//奇数 按位与& 相当于n%2!=0 
                n>>=1;//移位符号>> 相当于n=n/2; 
                x*=x; 
            }
    return y;
}
int main(){
cout<<exp1(3,24);

return 0;
}

扩展:求矩阵的快速幂(这里列举3*3矩阵的快速幂)

#include<iostream>
#include<string.h>
#include<algorithm>
#include<iomanip>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sstream>
using namespace std;
#define N 4
int ans[N][N],tmp[N][N];
int a[N][N];
void multi(int a[][N],int b[][N]) {
 memset(tmp,0,sizeof(tmp));
 for(int i=1; i<=N; i++) {
 for(int j=1; j<=N; j++) {
 for(int k=1; k<=N; k++) {
 tmp[i][j]+=a[i][k]*b[k][j];
 }
 }
 }
 for(int i=1; i<=N; i++) {
 for(int j=1; j<=N; j++)
 a[i][j]=tmp[i][j];
 }
}
void Pow(int a[][N],int n) {
 memset(ans,0,sizeof(ans));
 for(int i=1; i<=N; i++)
 ans[i][i]=1;
 while(n!=0) {
 if(n&1==1) {
 multi(ans,a);
 }
 multi(a,a);
 n>>=1;
 }
}
int main() {
int n;
cin>>n;
for(int i=1;i<=3;i++){  for(int j=1;j<=3;j++){ cin>>a[i][j];
 }
}
Pow(a,n);
for(int i=1;i<=3;i++){  for(int j=1;j<=3;j++){ cout<<ans[i][j]<<" "; } cout<<endl; } return 0; } 
  1. 求矩阵的转置
#include<iostream>
using namespace std;
void fun(int a[3][3]) {
    int t,i,j;
    for(int k=0; k<2; k++) {
        i=j=k;
        for(; i<3; i++) {
            for(; j<3; j++) {
                t=a[i][j];
                a[i][j]=a[j][i];
                a[j][i]=t;
            }
        }
    }
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++) {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}
int main() {
    int i,j,k,a[3][3];
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++) {
            cin>>a[i][j];
        }
    }
    fun(a);
    return 0;
}
  1. 二叉树求深度高度
#include<iostream>
using namespace std;
void fun(int a[3][3]) {
    int t,i,j;
    for(int k=0; k<2; k++) {
        i=j=k;
        for(; i<3; i++) {
            for(; j<3; j++) {
                t=a[i][j];
                a[i][j]=a[j][i];
                a[j][i]=t;
            }
        }
    }
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++) {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}
int main() {
    int i,j,k,a[3][3];
    for(i=0; i<3; i++) {
        for(j=0; j<3; j++) {
            cin>>a[i][j];
        }
    }
    fun(a);
    return 0;
}
  1. 蛇形矩阵
#include<iostream>
#include<string.h>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int a[100][100];
int main(){
int i,n,j,num=1;
cin>>n;
memset(a,0,sizeof(a));
i=0;
j=n-1;
a[i][j]=1;
while(num<n*n){  while(i+1<n&&!a[i+1][j]) a[++i][j]=++num; while(j-1>=0&&!a[i][j-1])
 a[i][--j]=++num;
 while(i-1>=0&&!a[i-1][j])
 a[--i][j]=++num;
 while(j+1<n&&!a[i][j+1])
 a[i][++j]=++num;
}
for(i=0;i<n;i++){  for(j=0;j<n;j++) cout<<a[i][j]<<" "; cout<<endl; } return 0; } 
  1. 暴力
#include <iostream> 
#include <cmath> 
using namespace std;  
int main()  
{  
    int sum=0;  
    for(int a=0; a<=9; a++)  
        for(int b=0; b<=9; b++)  
        {  
            if(abs(b-a)==1||b==a) continue;  
            for(int c=0; c<=9; c++)  
            {  
                if(abs(c-b)==1||c==a||c==b) continue;  
                for(int d=0; d<=9; d++)  
                {  
                    if(abs(d-a)==1||d==a||d==b||d==c) continue;  
                    for(int e=0; e<=9; e++)  
                    {  
                        if(abs(e-a)==1||abs(e-b)==1||abs(e-d)==1||e==a||e==b||e==c||e==d) continue;  
                        for(int f=0; f<=9; f++)  
                        {  
                            if(abs(f-a)==1||abs(f-b)==1||abs(f-c)==1||abs(f-e)==1||f==a||f==b||f==c||f==d||f==e) continue;  
                            for(int g=0; g<=9; g++)  
                            {  
                                if(abs(g-b)==1||abs(g-c)==1||abs(g-f)==1||g==a||g==b||g==c||g==d||g==e||g==f) continue;  
                                for(int h=0; h<=9; h++)  
                                {  
                                    if(abs(h-d)==1||abs(h-e)==1||h==a||h==b||h==c||h==d||h==e||h==f||h==g) continue;  
                                    for(int i=0; i<=9; i++)  
                                    {  
                                        if(abs(i-d)==1||abs(i-e)==1||abs(i-f)==1||abs(i-h)==1||i==a||i==b||i==c||i==d||i==e||i==f||i==g||i==h) continue;  
                                        for(int j=0; j<=9; j++)  
                                        {  
                                    if(abs(j-e)==1||abs(j-f)==1||abs(j-g)==1||abs(j-i)==1||j==a||j==b||j==c||j==d||j==e||j==f||j==g||j==h||j==i) continue;  
                                            sum++;  
                                        }  

                                    }  
                                }  
                            }  
                        }  
                    }  
                }  
            }  
        }  

    cout<<sum<<endl;  

    return 0;  
}  
  1. 最大公约数最小公倍数
#include <iostream>
using namespace std;
int yue(int a,int b) {
    if(b!=0) {
        return yue(b,a%b);
    } else
        return a;
}
int bei(int a,int b){
    return a*b/yue(a,b);
}
int main() {
    int a,b,yueshu,beishu;
    cin>>a>>b;
    yueshu=yue(a,b);
    beishu=bei(a,b);
    cout<<yueshu<<endl;
    cout<<beishu<<endl;
    return 0;
}
  1. 给出最大公约数和最小公倍数
#include<iostream>
using namespace std;
int yue(int a,int b) {
    if(b!=0) {
        return yue(b,a%b);
    } else
        return a;
}
int bei(int a,int b){
    return a*b/yue(a,b);
}
int main()
{
    int x0,y0;
    cin>>x0>>y0;
    int count=0;
    long long s=x0*y0;
    for(int q=x0;q<=y0;q+=x0)
    {
        if(bei(q,s/q)==y0)
            cout<<q<<" "<<s/q<<endl;
    }
    return 0;
}
  1. 判断素数
#include<iostream>
#include<math.h>
using namespace std;
int main() {
    int i,a,b,c;
    cin>>a;
    bool flag=true;
    for(i=2; i<=sqrt(a); i++) {
        if(a%i==0) flag=false;
    }
    cout<<flag;
    return 0;
}
  1. 判断闰年
#include <iostream>
using namespace std;
int main() {
    int n,i;
    cin>>n;
    if((n%4==0&&n%100!=0)||(n%400==0)) {
        cout<<"yes"<<endl;
    } else
        cout<<"no"<<endl;
    return 0;
}
  1. 并查集
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
const int size=100;
int father[size];
int find(int x){
    if(father[x]!=-1||father[x]!=1){
        father[x]=find(father[x]);
    }
    return father[x];
}
void dfs(int x){

}
int main(){
    memset(father,-1,sizeof(father));
    int n,min1,max1,a[size];cin>>n;
    cin>>a[1];
    father[a[1]]=1;
    min1=max1=a[1];
    for(int i=2;i<=n;i++){
        cin>>a[i];
        min1=min(min1,a[i]);
        max1=max(max1,a[i]);
        father[a[i]]=1;
    }
    for(int i=1;i<min1;i++){
        father[i]=0;
    }
    for(int i=1;i<=n;i++){
        if(find(a[i])!=0||find(a[i])!=1){
            dfs(a[i]);
        }
    }
    return 0;
} 
点赞