【发布时间】:2020-11-20 16:57:56
【问题描述】:
问题 -- 问题 94,Project Euler -- Python -- 几乎等边三角形
*很容易证明,不存在边长为整数、面积为整数的等边三角形。然而,几乎等边三角形 5-5-6 的面积为 12 个正方形单位。
我们将定义一个几乎等边三角形为两个边相等且第三条边相差不超过一个单位的三角形。
求所有边长和面积为整数且周长不超过十亿 (1,000,000,000) 的几乎等边三角形的周长之和。*
输出:518408346
我有一个非常低效的解决方案,如下:
- 我尝试暴力破解(花费了相当长的时间)(使用 for 循环)
- 然后我在条件中添加了检查它是否是三角形(两条边之和大于第三条)
- 接下来,我在周长变量中定义了值,并为面积变量使用了简单的几何图形
- 接下来,为了检查它们是否有效,对于周界,我使用了一种类型方法来检查它是否是 int 并且因为我不能对 area 做同样的事情(因为即使它是一个整数,它也是一部分float 类),我使用模 1 == 0 来检查它是否是整数
- 如果它满足条件,我将它添加到我的最终“周长总和”变量中。
代码如下:
import time
start = time.time()
plst = 0
o = 100000
for i in range(1,o):
j = i+1
if 2*i > j and j > 0:
p = 2*i + j
a = 0.5 * j* ((i**2 - (j/2)**2)**0.5)
# if p > 100:
# break
# else:
# pass
if type(p) == int and a % 1 == 0:
print(i)
print('\t', p)
plst += p
else:
pass
else:
pass
for k in range(1,o):
b = k-1
if 2*k > b and b > 0:
p = 2*k + b
a = 0.5 * b* ((k**2 - (b/2)**2)**0.5)
# if p > 100:
# break
# else:
# pass
if type(p) == int and a % 1 == 0:
print(k)
print('\t', p)
plst += p
else:
pass
else:
pass
print(plst)
print(f'{time.time() - start} seconds')
注意:
-
是的,我知道我的 o 值为 100000。
-
是的,我注释掉了检查周长变量是否超过十亿的条件,因为我在达到十亿之前遇到了问题。
-
不要介意注释代码。 我有两个问题需要帮助 按优先顺序排列
-
当我运行代码时,直到 10000,它运行良好且快速,但是当我跳到 100000 时,我意识到输出中弹出了一些不必要的值。(如 93686、93686、 93687)
A.我称之为不必要的,因为当我搜索时,一个网站显示了一个最终会产生答案的值表,而 93686 不是其中的一部分。(这是网站,https://blog.dreamshire.com/project-euler-94-solution/)
B.但是我在我的程序中找不到错误,我尝试了这些“不必要”数字的面积,令人惊讶的是,面积竟然是一个整数,这让我感到惊讶,这导致我得到了错误的答案
那么有人能解释一下错误是什么吗?
2。有人可以给我一个有效的解决方案,并用 Python 进行适当的解释吗?
我使用 python 3.8
【问题讨论】:
-
如果您在这里没有得到答案,请尝试codereview.stackexchange.com
标签: python python-3.x