代数结构与初等数论(1)——求不大于n且与n互质的个数

#include
#include
//求不大于n且与n互质的个数 可处理数据范围[1,10^12] 
int bj[1000000];
int pdss(long long x)
{
	long long i;
	for(i=2;i*i<=x;i++)
	{
		if(bj[i]==0) if(x%i==0) return 0;
	}
	return 1;
}
int main()
{
	int i,j,dj;long long x,na,ans;
	//打素数表 
	bj[1]=1;
	for(i=2;i<=99999;i++)
	{
		if(bj[i]==0)
		{
			int zj=2*i;
			while(zj<99999)
			{
				bj[zj]=1;
				zj+=i;
			}
		}
	}
	while(scanf("%lld",&x)!=EOF)
	{
		if(pdss(x)==1) ans=x-1;//若为质数,除了自己都互质 
		else
		{
			ans=x;na=x;
	        for(i=2;i*i<=na;i++)
	        {
	 	       if(x==1) break;
		       if(bj[i]==0)
		       {
			        dj=0;
			        while(x%i==0)
			        {
				        dj=1;
				        x=x/i;
			        }
			        if(dj==1)
			        {
				        ans*=(i-1);
                        ans/=i;
			        }
		        }
	        }
	        if(x!=1)//最后剩下一个大于sqrt(x)的素数 例子:20 
	        {
	        	ans*=(x-1);
                ans/=x;
			}
		}
	    printf("%lld\n",ans);
	}
	return 0;
}

 

 

你可能感兴趣的:(算法,数据结构)