gpt4 book ai didi

ruby - 如果用 Python 3 或 Ruby 编写,谁能解释为什么相同的代码会产生不同的结果?

转载 作者:数据小太阳 更新时间:2023-10-29 08:03:52 25 4
gpt4 key购买 nike

<分区>

在我的 ProjectEuler 尝试解决 Problem 23 ,我在网上找了一篇博客,用Python 3和Ruby准备了相同版本的脚本,只是为了测试哪个更快。

Python 3 打印的答案是 Ruby 的答案 - 1141。

我稍微修改了两个脚本以指出两个脚本开始具有不同行为的正确值。

虽然我无法解释为什么。

这是 Ruby 脚本:

def divisors(num)
divisors = []
(1...Math.sqrt(num)).each do |x|
if num % x == 0
divisors.push x
temp = num/x
divisors.push temp if temp != num && temp != x
end
end
return divisors
end

def is_abundant?(num)
sum = 0
divisors(num).each {|x| sum += x}
return sum > num
end

def main(limit)
numbers = (1..limit).select {|number| is_abundant? number}
sum = 0
canbewrittenasabundantsum = []
canbewrittenasabundantsum[limit]= nil

numbers.each do |num1|

numbers.each do |num2|

if (num1 + num2) <= limit
canbewrittenasabundantsum[num1+num2] = true
else
#break
end
end

end

(1...limit).each do |num|
sum += num if canbewrittenasabundantsum[num].nil?
end

return sum
end

def prova
puts("1140 -> #{main(1140)}")
puts("1141 -> #{main(1141)}")
puts("1142 -> #{main(1142)}")
puts("1143 -> #{main(1143)}")
puts("1144 -> #{main(1144)}")
puts("1145 -> #{main(1145)}")
puts("1146 -> #{main(1146)}")
puts("1147 -> #{main(1147)}")
puts("1148 -> #{main(1148)}")
puts("1149 -> #{main(1149)}")
puts("1150 -> #{main(1150)}")

puts "#{divisors(1141).inspect}, #{is_abundant?(1141)}"
puts "#{divisors(1142).inspect}, #{is_abundant?(1142)}"
end


prova

这是 Python 3:

from math import sqrt

def divisors(num):
divisors = []
for x in range(1, int(sqrt(num))+1):
if num % x == 0:
divisors.append(x)
temp = num//x
if (temp != num and temp != x): divisors.append(num/x)
return divisors

def is_abundant(num):
return sum(divisors(num)) > num

def main(Limit):
numbers = [x for x in range(1,Limit + 1) if is_abundant(x)]
sums = 0
canbewrittenasabundantsum = [False for x in range(0,Limit+1)]

for num1 in numbers:
for num2 in numbers:
if (num1+num2) <= Limit:
canbewrittenasabundantsum[num1+num2] = True
else:
break

for num in range(1,Limit):
if not canbewrittenasabundantsum[num]:
sums += num
return sums

def test():
print("1140 -> {}".format(main(1140)))
print("1141 -> {}".format(main(1141)))
print("1142 -> {}".format(main(1142)))
print("1143 -> {}".format(main(1143)))
print("1144 -> {}".format(main(1144)))
print("1145 -> {}".format(main(1145)))
print("1146 -> {}".format(main(1146)))
print("1147 -> {}".format(main(1147)))
print("1148 -> {}".format(main(1148)))
print("1149 -> {}".format(main(1149)))
print("1150 -> {}".format(main(1150)))

print(divisors(1141), is_abundant(1141))
print(divisors(1142), is_abundant(1142))

test()

有人能解释一下为什么会这样吗?我要疯了!

附言。这些是脚本的两个输出: ruby :

1140 -> 280223
1141 -> 280223
1142 -> 281364
1143 -> 281364
1144 -> 281364
1145 -> 281364
1146 -> 281364
1147 -> 281364
1148 -> 282511
1149 -> 282511
1150 -> 282511
[1, 7, 163], false
[1, 2, 571], false

Process finished with exit code 0

python :

1140 -> 280223
1141 -> 280223
1142 -> 280223
1143 -> 280223
1144 -> 280223
1145 -> 280223
1146 -> 280223
1147 -> 280223
1148 -> 281370
1149 -> 281370
1150 -> 281370
[1, 7, 163.0] False
[1, 2, 571.0] False

Process finished with exit code 0

因此,从 1142 开始,Python 似乎比 Ruby 落后 1141,我不明白为什么这个确切的值!您最多可以运行这些脚本 28123,唯一会给出不同结果的值就是这个!在输出的最后两行中,您可以看到 1141 和 1142 的除数和“is_abundant”结果……它们在两种语言中也是一样的!!

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com