nyoj-291 互素数个数 欧拉函数

 

LK的数学题

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 3
 
描述
LK最近遇到一个问题,需要你帮她一下。一个整数n,求[1,n)中,和n互素的数的个数。
 
输入
多组测试数据,每一行有一个整数n(n<1000000001),0表示输入结束。
输出
小于n同时和n互素的整数的个数
样例输入
7

12

0
样例输出
6 

4


开始用了原始方法,果断超时:
 

#include<stdio.h>



int prim(int a,int b)

{

    return (b==0)?(a==1):prim(b,a%b);

}



int main()

{

    int n;

    while(scanf("%d",&n),n)

    {

        int sum=0;

        for(int i=2;i<=n;++i)

            if(prim(n,i))

                sum++;

        printf("%d\n",sum+1);

    }

    return 0;

}

                

        
View Code

后来听说要用 欧拉定理,又是欧拉定理,看了半天果断还是不太懂。代码和 理论差的不小,算啦,记住代码算啦

代码:

#include<stdio.h>



int eular(int n)

{

    int ret=1,i;

    for(i=2;i*i<=n;i++)

        if(n%i==0)

        {

            n/=i;

            ret*=i-1;

            while(n%i==0)

            {

                n/=i;

                ret*=i;

            }



        }

    if(n>1)

        ret*=n-1;

    return ret;

}







int main()

{

    int n;

    while(scanf("%d",&n),n)

    {

        printf("%d\n",eular(n));

    }

return 0;

}

 

你可能感兴趣的:(函数)