Advertisement

一、质因数分解,筛法,求因数个数

阅读量:
复制代码
    //质因数分解
    int factorize(int x,int p[])
    {
     int cnt=0;
     for(int i=2;i*i<=x;i++)
     {
          while(x%i==0)
          {
               p[++cnt]=i;
               x/=i;
           }
      }
      if(x!=1)p[++cnt]=x;
      return cnt;    
    }
复制代码
    //求因数个数
      int d[105]={0},n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        for(int j=1;i*j<=n;j++)
            d[i*j]++;
    for(i=1;i<=10;i++)
        printf("d[%d]=%d\n",i,d[i]);

luogu3383为例
1、线性筛素数

复制代码
    #include <iostream>
    #include <algorithm>
    #define maxn 10000010
    using namespace std;
    int vis[maxn],prime[maxn],n,m;
    long long temp;
    void lxs()
    {
    	int cnt=0;
    	for(int i=2;i<=n;i++)
    	{
    		if(!vis[i])prime[++cnt]=i;
    		for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
    		{
    			vis[i*prime[j]]=prime[j];
    			if(i%prime[j]==0)break;
    		}
    	}
    }
    int main()
    {
    	cin>>n>>m;
    	vis[1]=1;
    	lxs();
    	for(int i=1;i<=m;i++)
    	{
    		cin>>temp;
    		if(vis[temp]!=0)cout<<"No"<<endl;
    		else cout<<"Yes"<<endl;
    	}
    	return 0;
    }

埃筛

复制代码
    #include <iostream>
    #define maxn 10000010
    using namespace std;
    bool no_prime[maxn];
    long long temp;
    int prime[maxn],n,m;
    void sieve()
    {
    	no_prime[1]=true;
    	for(int i=2;i<=n;i++)
    	{
    		if(!no_prime[i])
    		for(int j=i+i;j<=n;j+=i)no_prime[j]=true;
    	}
    }
    int main()
    {
    	cin>>n>>m;
    	sieve();
    	for(int i=1;i<=m;i++)
    	{
    		cin>>temp;
    		if(no_prime[temp])cout<<"No"<<endl;
    		else cout<<"Yes"<<endl;
    	}
    	return 0;
    }

全部评论 (0)

还没有任何评论哟~