【问题标题】:Find the sum of all the positive multiples 3 or 5 or 7 in ruby? [closed]求红宝石中所有正倍数 3 或 5 或 7 的总和? [关闭]
【发布时间】:2020-11-25 08:18:20
【问题描述】:

n < 1000

def compute_multiples_sum(n)
  #Logic
end

例如,对于 n=11 ,我们得到 3,5,6,7,9,10 作为倍数,这些倍数之和为 40。

我试过但找不到正确的输出。许多测试都失败了。

【问题讨论】:

  • 您需要明确n 的作用以及您所说的“3、5 和7 的正倍数”是什么意思。我认为后者的意思是在总和中您希望只包括整数m (2 < m <= 1000),其主要除数来自集合[3,5,7],但其中两个答案解释为包括所有可整除的整数乘以 3、5 或 7。这听起来不像是“3、5 和 7 的倍数”。
  • @CarySwoveland 问题是“或”,而不是“和”。给定的示例还反映了:“对于 n=11,我们得到 3,5,6,7,9,10 作为倍数”
  • @Stefan,是的,我的错。签证,对不起。我修改了答案。

标签: ruby-on-rails ruby sum question-answering


【解决方案1】:

我这样做了。

puts (1...n).select{ |n| n % 3 == 0 || n % 5 == 0 || n % 7 == 0 }.reduce(:+)

【讨论】:

  • 12 不是 3 的倍数? 3*4?这是我们这里的 OR 条件
  • 这里有一个错字。您检查了两次 n % 5 == 0 而从未检查过 n % 7 == 0
  • 是的。修正了它的错字。
  • 你可以通过写(1...n).sum { |n| n % 3 == 0 || n % 5 == 0 || n % 7 == 0 ? n : 0 } #=> 271066来避免临时数组(1...n).select{ |n| n % 3 == 0 || n % 5 == 0 || n % 7 == 0 }
【解决方案2】:

可能不是最优化的版本,但是:

def compute_multiples_sum(n)
  MULTIPLE_TO_KEEP = [3,5,7]
  (1..n).select { |value| MULTIPLE_TO_KEEP.any? { |to_keep| value%to_keep == 0} }.reduce(:+)
end

应该有更多更刀的方式来选择初始范围。

【讨论】:

    【解决方案3】:

    代码

    def tot_sum(n)
     sum_of_one(n, 3) + sum_of_one(n, 5) + sum_of_one(n, 7) -
     sum_of_one(n, 3*5) - sum_of_one(n, 3*7) - sum_of_one(n, 5*7) +
     sum_of_one(n, 3*5*7)
    end
     
    def sum_of_one(n, m)
      nbr_multiples = (n-1)/m
      m * (1 + nbr_multiples) * nbr_multiples / 2
    end
    

    示例

    tot_sum(120)
      #=> 3951
    tot_sum(1000)
      #=> 271066
    tot_sum(10**30)
      #=> 271428571428571428571428571427928571428571428571428571428569 
    

    说明

    考虑n = 120 的示例。首先将1119 之间可以被3 整除的整数相加:

    nbr_multiples = (120 - 1)/3
      #=> 39
    
    3 * (1 + 2 + ... + nbr_multiples)
    

    括号中的表达式等于一个代数级数的总和,所以总和等于:

    3 * (1 + nbr_multiples) * nbr_multiples / 2
      #=> 2340
    

    这正是sum_of_one(120, 3)执行的计算:

    sum_of_one(120, 3)
      #=> 2340
    

    同样,

    sum_of_one(120, 5)
      #=> 1380
    sum_of_one(120, 7)
      #=> 1071 
    

    这三个计算的总和是:

    2340 + 1380 + 1071
      #=> 4791
    

    但是,这个总数是 3 * 5 = 153 * 7 = 215 * 7 = 35 的倍数。因此,我们必须从总数中减去以下各项:

    sum_of_one(120, 3*5)
      #=> 420
    sum_of_one(120, 3*7)
      #=> 315 
    sum_of_one(120, 5*7)
      #=> 210
    

    给我们:

    4971 - 420 - 315 - 210
      #=> 3846
    

    这种调整本身会导致另一个问题,其中涉及小于1203*5*7 #=> 105 的倍数。这些值(实际上只有一个105)包含在sum_of_one 的所有前三个计算中,但也包含在从第一个总数中减去的所有三个调整中,净效果是它们是不包括在最后的总数中。因此,我们必须将它们重新添加:

    3846 + sum_of_one(120, 3*5*7)
      #=> 4026 + 105 => 3951
    

    这等于所需的值,即小于 120 且是 3、5 或 7 倍数的正整数之和。如果事实是 tot_sum(120) 执行的计算。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 2012-09-21
      • 2010-10-09
      • 1970-01-01
      相关资源
      最近更新 更多