算法,发现第一个三角形数与> 500的因素正在运行缓慢 [英] Algorithm that finds first triangle number with > 500 factors is running to slow

查看:215
本文介绍了算法,发现第一个三角形数与> 500的因素正在运行缓慢的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的算法,发现与系列> X因素,第一个三角形数。我可以运行它高达大约x = 150,之后,它永远。我可以做什么样的变化,以加快步伐?谢谢!

 高清triangle_numbers_max_divisors(X)
    triangle_numbers = []
    除数= 0
    一个= 1; B = 2

    直到除数> x
        除数= 0
        triangle_numbers.push(一)
        一个= A + B; B + 1 =

        因为我在1..triangle_numbers.last
            如果triangle_numbers.last%我== 0
                除数+ = 1
            结束
        结束
    结束
    triangle_numbers.last
结束
 

解决方案

您code运行缓慢的原因在其他的答案已经给出。这里是一个Ruby样的方式来$ C C算法$。大概花了大约10秒钟来解决。*

code

 高清triangle_numbers_max_divisors(min_nbr_factors)
  (1..Float ::无穷大)。降低(0)办| tnbr,N |
    tnbr + = N
    如果返回tnbr nbr_factors(tnbr)> = min_nbr_factors
    tnbr
  结束
结束

高清nbr_factors(N)
  M =的Math.sqrt(N)
  2 * 1.upto(M).Count之间{| I | (N%I).zero? }  - ((正== m * m的)1:0)
结束

p triangle_numbers_max_divisors(500)#=> 76_576_500
 

说明

  • 您只需要一个单一的值,所以没有必要继续除数。仅仅指望他们。
  • 如果 N 是一个完美的正方形,术语 - ((N = = M * M)?1:0 引起 N 的平方根为只计算一次。
  • 有时你会看到(1..Float :: INFINITY)写成(1..1.0 / 0)

。 *在最近的一个复古的MacBook Pro

This is my algorithm that finds the first triangle number with > x factors. I can run it up to about x = 150, and after that it takes forever. What changes can I make to speed it up? Thanks!

def triangle_numbers_max_divisors(x)
    triangle_numbers = []
    divisors = 0
    a = 1; b = 2

    until divisors > x
        divisors = 0
        triangle_numbers.push(a)
        a = a + b; b += 1

        for i in 1..triangle_numbers.last
            if triangle_numbers.last % i == 0
                divisors += 1
            end
        end
    end
    triangle_numbers.last
end

解决方案

The reasons your code is running slowly have been given in other answers. Here is a Ruby-like way to code the algorithm. It took about about 10 seconds to solve.*

Code

def triangle_numbers_max_divisors(min_nbr_factors)
  (1..Float::INFINITY).reduce(0) do |tnbr, n|
    tnbr += n
    return tnbr if nbr_factors(tnbr) >= min_nbr_factors
    tnbr
  end
end

def nbr_factors(n)
  m = Math.sqrt(n)
  2 * 1.upto(m).count { |i| (n % i).zero? } - ((n == m * m) ? 1 : 0)
end   

p triangle_numbers_max_divisors(500) #=> 76_576_500

Explanation

  • You only want a single value, so there is no need to keep divisors. Just count them.
  • If n is a perfect square, the term - ((n == m * m) ? 1 : 0 causes n's square root to be counted only once.
  • Sometimes you will see (1..Float::INFINITY) written as (1..1.0/0).

. * On a recent-vintage Macbook Pro

这篇关于算法,发现第一个三角形数与> 500的因素正在运行缓慢的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆