【问题标题】:Project Euler #50 - Consecutive prime sum - RubyProject Euler #50 - 连续素数 - 红宝石
【发布时间】:2017-01-01 19:57:09
【问题描述】:

我正在尝试解决 Project Euler 问题 #50 (https://projecteuler.net/problem=50),其中问题定义为:

100 万以下的哪个素数可以写成最 连续素数?

我提出了两种不同的解决方案,它们都给出了相同的错误答案,这让我相信在我构建素数列表时会发生错误,但是,我似乎找不到任何错误。我的解决方案似乎也适用于N = 10N = 100,但不适用于N = 1000。任何帮助表示赞赏。

解决方案 1:(输出 = 958577)

require 'Prime'

# Initialising primes
N = 1_000_000
primes = {}

(2..N).each do |i|
  primes[i] = true
end

i = 2

while i * i <= N
  if primes[i]
    j = i
    while i * j <= N
      primes[i * j] = false
      j += 1
    end
  end
  i += 1
end

# New prime list where total sum is less than N
new_primes = []
i = 2
sum = 0

while sum + i < N
  if primes[i]
    new_primes << i
    sum += i
  end
  i += 1
end

# Keep removing last prime from list until total sum is prime
while true
  if Prime.prime?( new_primes.inject(0, :+) )
    puts new_primes.inject(0, :+)
    break
  else
    new_primes.delete_at(-1)
  end
end

解决方案 2:(输出 = 958577)

require 'Prime'

# Initialising primes
N = 1_000_000
primes = {}

(2..N).each do |i|
  primes[i] = true
end

i = 2

while i * i <= N
  if primes[i]
    j = i
    while i * j <= N
      primes[i * j] = false
      j += 1
    end
  end
  i += 1
end


sum = 0
max = 0
i = 2

while i < N
  if primes[i]
    sum += i
    if sum < N && Prime.prime?(sum)
      max = sum
    end
  end
  i += 1
end

puts max

【问题讨论】:

    标签: ruby algorithm debugging primes


    【解决方案1】:

    (w.r.t to Solution 2)您查找素数的方法似乎是正确的。问题在于你的逻辑。如果小于N 的素数是p_1,p_2,..,p_k,那么您只考虑 只有p_1p_1+p_2p_1+p_2+p_3、...、p_1+p_2+..+p_k 的总和。如果总和不是从p_1 开始的,比如p_3+p_4

    【讨论】:

    • 这对我来说似乎是一个明显的错误,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多