[Codewars]-Number of Proper Fractions with Denominator d

具有分母d的适当分数的数量(Number of Proper Fractions with Denominator d)

题目:

  • 简单说就是以n为分母的,不能化简的,真分数,有多少个。
  • n=16举个例子:
    • 5/16是符合题意的,而6/16可以化简为3/8故不合题意,不计算在内。
    • 一共有8个符合题意的真分数:1/15, 2/15, 4/15, 7/15, 8/15, 11/15, 13/15 和 14/15
  • 测试用例
properFractions(1)==0
properFractions(2)==1
properFractions(5)==4
properFractions(15)==8
properFractions(25)==20

思路:

  • 一开始的时候我是直接暴力破解的,发现时间复杂度很高( N N
  • 后来对寻找质因数做了很多优化,还是不行,时间爆栈了。
  • 接着问了下度娘发现这其实是一个很经典的问题:寻找1到N中与N互质的数,也就是欧拉函数
  • 接着用代码实现欧拉函数就好了
  • 文末有几个参考文档可以阅读一下

解答:

function properFractions(n){
  //your code here
    if (n === 1) return 0;
    let res = n, a = n;
    for (let i = 2; i <= Math.sqrt(a); i++) {
       if (a%i===0) {
            res = res/i*(i-1);
            while(a%i === 0) a /= i;
       }
    }
    if (a>1) res = res/a*(a-1)
    return res
}

参考文档

1.欧拉函数的求法与应用——sentimental_dog
2.欧拉函数——Lur

猜你喜欢

转载自blog.csdn.net/qq_41882147/article/details/80998615