歐拉函數

φ函數的值φ(x)表示小於等於x且與x互質的數

通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中pn是x的質因數

例如:x=12,φ(x)=12*(1-1/2)*(1-1/3)

#include <stdio.h>
#include <string.h>
#include <math.h>
int p[1000005];
int mark[1000005];
int prime(int n)    //判斷素數
{
    double t=sqrt(n*1.0);
    for(int i=2;i<=t;i++)
    {
        if(n%i==0)
            return 0;
    }
    return 1;
}
int tot;
void findprime()       //素數篩選
{
    int i,j;
    p[1]=2;
    p[2]=3;
    for(i=4;i<1000005;i++)
    {
        if(mark[i]==1)
            continue;
        if(prime(i)==1)
        {
            p[tot++]=i;
            for(j=2;j*i<1000005;j++)
                mark[i*j]=1;
        }
    }
}
int oula(int n)     //歐拉函數
{
    int i=1;
    int sum=n;
    while(n!=0)
    {
        if(p[i]>n)
            break;
        if(n%p[i]==0)
        {
            sum-=sum*(1.0/p[i]);
            while(n%p[i]==0)
                n/=p[i];
        }
        i++;
    }
    return sum;
}
int main()
{
    int n;
    tot=3;
    memset(mark,0,sizeof(mark));
    memset(p,0,sizeof(p));
    findprime();
    while(scanf("%d",&n)!=-1)
    {
        printf("%d\n",oula(n));
    }
    return 0;
}


發佈了58 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章