全文围绕以上两个公式展开
---------------------------------------------------------------------------------------------------------------------------
//直接对n进行素因子分解
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int phi(int n){
int ans=n;
for(int i=2;i<=n;i++){
if(n%i==0)
ans=ans/i*(i-1); //相当于 ans=ans-ans/i;
while(n%i==0) n/=i;
}
return ans;
}
int main()
{
int n;
while(cin>>n){
cout<<phi(n)<<endl;
}
return 0;
}
//对上面进行优化
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int phi(int n){
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0)
ans=ans/i*(i-1); //相当于 ans=ans-ans/i;
while(n%i==0) n/=i;
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
int main()
{
int n;
while(cin>>n){
cout<<phi(n)<<endl;
}
return 0;
}
//素数表实现
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include<cstring>
using namespace std;
bool book[50000];
int p[2000];
//线性素数筛法
void prime(){
memset(book,0,sizeof(book));
book[0]=book[1]=1;
int k=0;
for(int i=2;i<50000;i++){
if(!book[i]) p[k++]=i;
for(int j=0;j<k&&i*p[j]<50000;j++){
book[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
int phi(int n){
int ans=n;
for(int i=0;p[i]*p[i]<=n;i++){
if(n%p[i]==0)
ans=ans/p[i]*(p[i]-1);
while(n%p[i]==0) n/=p[i];
}
if(n>1) ans=ans/n*(n-1);
return ans;
}
int main()
{
prime();
int n;
while(cin>>n){
cout<<phi(n)<<endl;
}
return 0;
}
// 筛法求函数值
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int phi[50010];
void phi_table(int n){
for(int i=2;i<=n;i++){
phi[i]=0;
}
phi[1]=1;
for(int i=2;i<=n;i++){
if(!phi[i]){ //如果i目前不存在,则对i以及i的倍数进行构造。
for(int j=i;j<=n;j+=i){
if(!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-1); //前面i不存在说明筛选下来i为素数,故对j进行素因子处理操作。
}
}
}
}
int main()
{
phi_table(50000);
int n;
while(cin>>n){
cout<<phi[n]<<endl;
}
return 0;
}
线性筛法
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
bool vis[maxn];
int fai[maxn];
int prime[maxn];
void get_oula(int n){
memset(vis,0,sizeof(vis));
fai[1]=1;
int tot=0;
for(int i=2;i<n;i++){
if(!vis[i]){
prime[tot++]=i;
fai[i]=i-1;
}
for(int j=0;j<tot;j++){
if(i*prime[j]>n) break;
vis[i*prime[j]]=true;
if(i%prime[j]==0){
fai[i*prime[j]]=fai[i]*prime[j];
break;
}else{
fai[i*prime[j]]=fai[i]*(prime[j]-1);
}
}
}
}
int main(){
get_oula(5000000);
for(int i=1;i<100;i++){
cout<<fai[i]<<endl;
}
return 0;
}