比较杂的小算法

本文涵盖多种核心算法实现,包括并查集、全排列、逆元计算等,并提供了求解特定数学问题的方法,如丑数计算及三角形面积计算。

并查集:
int finds(int x)//找老大
{
    int j,d=x;
    while(x!=a[x])
        x=a[x];
    while(a[d]!=x)
    {
        j=d;
        d=a[d];
        a[j]=x;
    }
    return x;
}
int merger(int a,int b)//合并老大
{
    x[findd(a)]=findd(b);
}//x数组的值为老大,下标为小弟

丑数:
#include<iostream>//若一个数的所有素因子是2、3、5、7中的一个或多个,则这个数成为Humble数。求第n个Humble数是多少。
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int x[100000];
int Min(int a,int b,int c,int d)
{
    return min(a>b?b:a,c>d?d:c);
}
int main()
{
    x[1]=1;
    int a1=1,a2=1,a3=1,a4=1;
    for(int i=2;i<=5842;i++)
    {
        x[i]=Min(2*x[a1],3*x[a2],5*x[a3],7*x[a4]);
        if(x[i]==2*x[a1]) a1++;
        if(x[i]==3*x[a2]) a2++;
        if(x[i]==5*x[a3]) a3++;
        if(x[i]==7*x[a4]) a4++;
    }
    int n;
    while(~scanf("%d",&n)&&n)
    {
        printf("The %d",n);
        if(n % 10 == 1 && n % 100 != 11)
            printf("st");
        else if(n % 10 == 2 && n % 100 != 12)
            printf("nd");
        else if(n % 10 == 3 && n % 100 != 13)
            printf("rd");
        else
            printf("th");
        printf(" humble number is %d.\n",x[n]);
    }
}

函数全排:
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
    int n,p[10],i;
    while(scanf("%d",&n))
    {
        for(i=0; i<n; i++)
            p[i]=i+1;
        sort(p,p+n);
        do
        {
            for(i=0; i<n; i++)
                printf("%d ",p[i]);
            printf("\n");
        }
        while(next_permutation(p,p+n));
    }
}

逆元:
long long inv(long long a,long long mod)
{
    return a==1?1:inv(mod%a,mod)*(mod-mod/a)%mod;
} 

全排列:
#include<stdio.h>
#include<string.h>
void fun(int n,int a[],int c)
{
    int i,j;
    if(c==n)
    {
        for(i=0; i<n; i++)
            printf("%d",a[i]);
        printf("\n");
    }
    else for(i=1; i<=n; i++)
        {
            int f=1;
            for(j=0; j<c; j++)
                if(a[j]==i)
                    f=0;
            if(f)
            {
                a[c]=i;
                fun(n,a,c+1);
            }
        }
}
int main()
{
    int nn;
    scanf("%d",&nn);
    while(nn--)
    {
        int n;
        scanf("%d",&n);//n的全排列
        int c=0,a[10];
        fun(n,a,c);
    }
}


数学公式求三角形面积:
int area(int x1,int y1,int x2,int y2,int x3,int y3)//逆时针正,顺时针负,面积为三角形面积的2倍
{
    return abs(x1*y2+x3*y1+x2*y3-x3*y2-x1*y3-x2*y1);
}
int judgemax(int a,int b,int c)
{
    return a>b?a>c?a:b>c?b:c:b>c?b:a>c?a:c;
}
int judgemin(int a,int b,int c)
{
    return a<b?a<c?a:b<c?b:c:b<c?b:a<c?a:c;
}
S=sqrt(p*(p-a)(p-b)(p-c))//p=(a+b+c)/2,a,b,c为三边长


文件输入输出:
 freopen("Input.txt","r",stdin);
    freopen("Output.txt","w",stdout);


线性欧拉函数筛法:
/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/
int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数,pt是素数个数
 
int make()
{
    phi[1]=1;
    int N=maxn;
    int k;
    for(int i=2;i<N;i++)
    {
        if(!m[i])//i是素数
            p[pt++]=m[i]=i,phi[i]=i-1;
        for(int j=0;j<pt&&(k=p[j]*i)<N;j++)
        {
            m[k]=p[j];
            if(m[i]==p[j])//为了保证以后的数不被再筛,要break
            {
                phi[k]=phi[i]*p[j];
/*这里的phi[k]与phi[i]后面的∏(p[i]-1)/p[i]都一样(m[i]==p[j])只差一个p[j],就可以保证∏(p[i]-1)/p[i]前面也一样了*/
                break;    
            }
            else
                phi[k]=phi[i]*(p[j]-1);//积性函数性质,f(i*k)=f(i)*f(k)
        }
    }
}


2种素数筛法:
    //普通筛法
        for(i=2; i<=n; i++)
        {
            if(a[i]!=0)
                for(j=i+i; j<=n; j+=i)
                    a[j]=0;
        }
    //线性筛法
    memset(x,0,sizeof(x));
    memset(y,0,sizeof(y));
    int cont=0;
    for(int i=2; i<1001000; i++ )
    {
        if(!x[i])
            y[cont++]=i;
        for(int j=0; j<=cont&&i*y[j]<1001000; j++)
        {
            x[i*y[j]]=1;
            if(!(i%y[j]))
                break;
        }
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值