Relatives(欧拉函数)

Description

Given n, a positive integer, how many positive integers less than n are relatively prime to n? Two integers a and b are relatively prime if there are no integers x > 1, y > 0, z > 0 such that a = xy and b = xz.

Input

There are several test cases. For each test case, standard input contains a line with n <= 1,000,000,000. A line containing 0 follows the last case.

Output

For each test case there should be single line of output answering the question posed above.

Sample Input
7
12
0

Sample Output
6
4

解题思路:欧拉函数:求不大于n且与n互质的数的个数。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int Euler(int x){
 4     int r=x;
 5     for(int i=2;i*i<=x;i++){//由于任何一个合数都至少有一个不大于根号x的质因子,所以只需遍历到根号x即可
 6         if(x%i==0){
 7             r=r/i*(i-1);//欧拉函数的通式,先除后乘,避免数据溢出
 8             while(x%i==0)x/=i;//消除x中所有质因子i,直到不能被i整除
 9         }
10     }
11     if(x>1)r=r/x*(x-1);//如果x大于1,说明还有一个质因子没有除掉
12     return r;//返回个数
13 }
14 int main(){
15     int n;
16     while(cin>>n&&n)
17         cout<<Euler(n)<<endl;
18     return 0;
19 }

 

posted @ 2018-07-16 13:26  霜雪千年  阅读(298)  评论(0编辑  收藏  举报