素數,分解質因數, 約數,擴展歐幾里得

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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章