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

这篇文章描述了一个C语言程序,用于计算不大于给定整数n且与n互质的素数数量。它首先生成素数表,然后根据输入的x值,判断是否为质数,如果是,则答案为x-1;否则,通过分解因子找到所有互质的数并计算它们的乘积。
摘要由CSDN通过智能技术生成
#include<stdio.h>
#include<stdlib.h>
//求不大于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;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值