素数,分解质因数, 约数,扩展欧几里得

ceil()//上取整
floor()//下取整

//判断一个数是不是素数
bool is_prime(int n)
{
    if(n<2)  return false;
    for(int i=2;i<=n/i;i++)
    {
        if(n%i==0) 
        return false;
    }
    return true;
}
//判断一堆数是不是素数
int prim[N];    //prim[]初始化为0   0代表素数,1代表合数
void solve(int TOP)
{
    prim[0]=prim[1]=1;
    for(int i=2;i*i<TOP;i++)
        if(!prim[i])
            for(int j=i*i;j<TOP;j+=i)
                prim[j]=1;
}

//分解质因数
int solve(int n)
{
	int a[10000];//底数
	map<int,int> mp; //底数出现的次数
    int num=0;
    memset(a,0,sizeof a);
    mp.clear();
    for(int i=2;i<=n/i;i++)
    {
        if(n%i==0)
            a[num++]=i;
        while(n%i==0)
        {
            mp[i]++;
            n=n/i;
        }
    }
    if(n>1)
    {
        a[num++]=n;
        mp[n]++;
    }
    for(int i=0;i<num;i++)
        cout<<a[i]<<" "<<mp[a[i]]<<endl;
    cout<<endl;
}

//扩展欧几里得
int exgcd(int a, int b, int &x, int &y) 
{ // 拓展欧几里得算法, 也就是生成贝祖数的算法
    if (!b) 
    {
        y = 0; x = 1;
        return a;
    }
    exgcd(b, a % b, y, x); 
    y -= a / b * x; // 贝祖数的递推公式
    return d;//返回值是最大公约数,xy是其中的一组解
}

还得补充一句话,就是约数个数=累乘(幂次方+1)
~
~
~
~
~
~

Prime Distance

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=11092019;
const int N=1000010;
int prim[N],pri[N],cnt;
ll st[N];
void shusu(int top)
{
    prim[0]=prim[1]=1;
    for(int i=2;i*i<=top;i++)
        if(!prim[i])
            for(int j=i*i;j<=top;j+=i)
                prim[j]=1;
    for(int i=0;i<=top;i++)
        if(!prim[i])
            pri[cnt++]=i;

}
int main()
{
    shusu(55555);
    ll l,r;
    while(cin>>l>>r)
    {
        memset(st,0,sizeof st);
        for(ll i=0;i<cnt;i++)
        {
            ll p=pri[i];
            for(ll j=max(2*p,(ll)(ceil(l*1.0/p)*p));j<=r;j+=p)
                st[j-l]=1;
        }
        //ceil(l*1.0/p)*p
        //(l+p-1)/p*p
        ll sum=0;
        for(int i=0;i<=r-l;i++)
            if(!st[i]&&i+l>=2)
                prim[sum++]=i+l;
        if(sum<2)
            cout<<"There are no adjacent primes."<<endl;
        else
        {
            int minn=0,maxx=0;

            for(int i=0;i<sum-1;i++)
            {
                int d=prim[i+1]-prim[i];
                if(d<prim[minn+1]-prim[minn])
                    minn=i;
                if(d>prim[maxx+1]-prim[maxx])
                    maxx=i;
            }
            printf("%d,%d are closest, %d,%d are most distant.\n",prim[minn],prim[minn+1],prim[maxx],prim[maxx+1]);

        }
    }

    return 0;
}

©️2020 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值