0

编写一个函数,打印出数字 1 到 100 的所有因子。

真正的业余编码员,但这是我迄今为止的尝试。

def factors_numbers(n1,n2)
  (n1..n2).each do |n|
    factors = []
    factors << 1 ##every number has a factor of 1
    factors << n ##every number is a factor of itself
    i = 1
    while i < n 
        new_number = n % (n-i) 
        if new_number == 0 #if 0, divisible and that means two numbers are factors
            factors << new_number
            factors << (n-i)
        end
        i += 1
    end
    return factors
  end
end
4

6 回答 6

1

这是您的代码的改进版本:

def factors_numbers(n1,n2)
  all_factors = {}
  (n1..n2).each do |n|
    factors = []
    (1..Math.sqrt(n).floor).each do |i|
      remainder = n % i
      if remainder == 0 #if 0, divisible and that means two numbers are factors
        factors << i
        factors << n/i
      end
    end
    factors = factors.sort.uniq
    puts "Factors of #{n}: #{factors.join(',')}"
    all_factors[n]=[factors]
  end
  return all_factors
end
于 2013-11-17T00:40:20.990 回答
0

你想要独特的因素吗?也就是说,在 1-100 的范围内,我应该得到数字 1 一百次,还是只得到一次?

最简单的方法是利用“注入”枚举方法。

def find_all_factors_between(n1,n2)
  (n1..n2).inject([]) do |factors, num|
    factors + (1..num).inject([]) { |arry, test| num % test == 0 ? arry + [test] : arry }
  end
end

最后要注意的一件事是 Ruby 有隐式返回。也就是说,只要你方法的最后一行的输出是你的factors变量,你就不必说return factors.

于 2013-11-17T00:37:07.857 回答
0
(n1..n2).each{|x| print "#{x}: #{(1..x).select{|y| x % y == 0}}\n"}

应该这样做:)

编辑:实施 Cary Swoveland 的建议

于 2013-11-17T00:48:01.880 回答
0

我的条目是:

def find_all_factors_between(n1, n2)
  factors = -> (n) { (1..n).select {|i| n % i == 0} }
  (n1..n2).each { |n| puts "Factors of #{n}: #{factors.(n).join(', ')}" }
end

find_all_factors_between(1,100)
于 2013-11-17T00:50:33.877 回答
0

好吧,如果你想用枚举来做,总有

def factor_numbers(rng)
  factors = rng.map do |n|
    (1..Math.sqrt(n).floor)         # search numbers <= square root
      .select { |d| n % d == 0 }    # find factors <= square root
      .flat_map { |x| [x, n / x] }  # combine with factors >= square root
      .sort                         # order from least to greatest
      .uniq                         # remove dupes (basically the square root)
  end

  Hash[rng.zip(factors)]            # rng = keys, factors = values
end

puts factor_numbers(1..100)

这不是最有效的,但我的观点是,您在 C 或 JavaScript 等语言中看到的许多 for/while 结构可以在 Ruby 中以其他方式表达。

于 2013-11-17T03:06:27.153 回答
0
def factor_nums(n1,n2)
    all_factors = {}
    (n1..n2).each do |n|
        factors = []
        (1..n).each do |i|
            remainder = n % i
            factors << i if remainder == 0
        end
        all_factors[n] = factors
    end
return all_factors
end
于 2018-02-16T04:38:14.080 回答