2013寒假练习 1049 Relatives

本文介绍了如何使用质因数分解的方法来计算一个整数n的欧拉函数值,并提供了两种C++实现方式,包括一种手动判断质数和质因数分解的方式及一种更简洁的模板代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址:http://acm.bit.edu.cn/mod/programming/view.php?id=700

题意:求n的欧拉函数值。。

原理是"φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数。"

如12=2^2*3 那么φ(12)=12*(1-1/2)*(1-1/3)

自己写的代码比模板啰嗦很多。要背模板了。。

#include<iostream>
using namespace std;
int prime[10000];
bool judge(int a)
{
	if(a%2==0) return 0;
	for(int i=3;i*i<=a;i+=2)
	{
		if(a%i==0) return 0;
	}
	return 1;
	
}
int main()
{
	int sub=1,i,ans,n;
	prime[0]=2;
	for(i=3;i<100000;i+=2)     //打素数表
	{
		if(judge(i)) prime[sub++]=i;
	}
	while(scanf("%d",&n),n)
	{
		ans=n;
		int tn=n;
		for(i=0;prime[i]*prime[i]<=tn;i++) //因数分解,根据公式得出答案
		{
			if(n%prime[i]==0) 
			{
				ans=ans/prime[i]*(prime[i]-1);
				while(n%prime[i]==0) n/=prime[i];
			}
		}
		if(n==1) printf("%d\n",ans); 
		else printf("%d\n",ans/n*(n-1)); //
	}
	return 0;
}

模板备份:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
long long euler(long long n)//求n的欧拉函数  
{  
    long long ans=1,i;  
    for(i=2;i*i<=n;i++)  
        if (n%i==0)  
        {  
            ans*=i-1; n/=i;  
            while(n%i==0)  
            { ans*=i; n/=i; }  
        }  
    if (n>1) ans*=n-1;  
    return ans;  
} 
int main()
{
	long long n;
	while(scanf("%lld",&n),n)
	{
		printf("%lld\n",euler(n));
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值