欧拉函数定义为小于n的所有与n互素的数的个数。
公式是
其中xi为n的质因数,即xi既是质数也是n的因数,s指n的所有质因数的个数
或者写成这样(p,q等都是质因数,n,m是指数)
则
所以欧拉函数只和质因数有关
相关公式推导查看离散数学课本
现在要编写程序,关键就是求出质因数
怎么找到它呢,可以从2开始循环,如果n%i==0,那i肯定是最小的那个质因数,但是之后的i就不一定了,所以要对n做处理
#include<iostream>
using namespace std;
int main( )
{
int n;
cin>>n;
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){//i此时是一个质因数
ans=ans/i*(i-1);
while(n%i==0) n/=i;//更新n
}
}
if(n>1) ans=ans/n*(n-1);//最后一个质因子
cout<<ans;
return 0;
}
i一定是质因数吗?一定,如果i不是质数,那i的某个因数之前肯定已经循环到了,所以满足n%i==0的i肯定是质数
为什么有个while循环?就是这一步骤才能确保i是质因数,这个while循环相当与除了,这样之后不会被q的倍数影响到了;
循环过后如果n大于1,那么就是剩下最后一个质因子了,因为循环的条件是i*i<=n,再最后处理一下,而且如果是经过循环剩下的最后一个质因子,它的幂肯定是1了,所以直接处理。
本文介绍了欧拉函数的概念,重点阐述了如何通过C++编程找到小于给定数n的所有质因数,以计算欧拉函数值。代码中涉及循环、质数判断和除法操作以确保正确性。
188

被折叠的 条评论
为什么被折叠?



