题目描述
给定一个数字 N , 输出N 的欧拉函数值。
输入:
输入包含一个正整数 N ,2≤N≤2000000000.
输出:
输出一个整数,表示 N 的欧拉函数值。
样例输入:
6
5
样例输出:
2
4解题思路
设一个数A=ax11∙ax22∙⋯∙axnn , 那么 A 的欧拉函数:
phi(A)=ax1−11∙(a1−1)∙ax2−12∙(a2−1)∙⋯∙axn−1n∙(an−1)
整理这个公式的时候,不能发现,从这个公司出发很容易地用程序去实现求 phi(A) 的操作。
具体的做法就是,先令 temp=A , 然后每找到一个 A 的质因子x ,就从 temp 中除掉一个该因子 x ,再乘以(x−1) 。
通过这道题,可以发现,在做一些数学类问题的时候,往往推出的公式能简化程序。- 代码如下:
// Euler.cpp
#include <stdio.h>
#include <stdlib.h>
typedef __int64 int64; //定义__int64的别名为int64
int64 phi(int64 a){ //求a的欧拉函数值,即phi(a)
int64 temp=a;
for (int64 i=2;i*i<=a;i++) //寻找a的质因子
{
if (a%i == 0)
{
while(!(a%i))
a /= i;
temp = temp/i * (i-1);
}
}
if(a!=1)
temp = temp/a * (a-1);
return temp;
}
void main()
{
int64 a;
while(scanf("%I64d",&a)!=EOF)
printf("%I64d\n",phi(a)); //__int64的格式化输出
}
效果如下:
