A fraction m / n is basic if 0 ≤ m < n and it is irreducible if gcd(m, n) = 1. Given a positive integer n, in this problem you are required to find out the number of irreducible basic fractions with denominator n.
For example, the set of all basic fractions with denominator 12, before reduction to lowest terms, is

Reduction yields

Hence there are only the following 4 irreducible basic fractions with denominator 12

Input
Each line of the input contains a positive integer n (< 1000000000) and the input terminates with avalue 0 for n (do not process this terminating value).
Output
For each n in the input print a line containing the number of irreducible basic fractions with denominator n.
Sample Input
12
123456
7654321
0
Sample Output
4
41088
7251444
给定一个正整数n,求在[1, n]区间内和n互质的正整数的个数。直接使用欧拉函数进行计算。
#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(void)
{
int n;
while(~scanf("%d", &n) && n)
printf("%d\n", eular(n));
return 0;
}
/*
* 欧拉函数:数论中,对于正整数n,欧拉函数是小于n的数中与n互质的数的数目。
* 此函数以其首名研究者欧拉命名(Ruler'so totient function),
* 又称为Euler's totient function、φ函数、欧拉商数等。
*
*/
欧拉函数关键代码:
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;
}
本文介绍了一种利用欧拉函数计算与给定正整数n互质的正整数数量的方法。通过实现一个名为eular的函数,文章详细展示了如何遍历从2到根号n的范围,检查每个数是否为n的因数,从而计算出互质数的总数。此方法在处理大数值时特别有效。
647

被折叠的 条评论
为什么被折叠?



