这篇文章是双重的。我是Python的新手。
第一部分。
这是我的旧Google难题的代码:'E'连续数字中的前10位质数'(https://google-tale.blogspot.ca/2008/07/google-billboard-puzzle.html(
euler = '7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509961818815930416903515988885193458072738667385894228792284998920868058257492796104841984443634632449684875602336248270419786232090021609902353043699418491463140934317381436405462531520961836908887070167683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354'
for i in range(len(euler) - 3):
if (euler[i + 3]== '1' or euler[i + 3]== '3' or euler[i + 3]== '7' or euler[i + 3]== '9'):
number = int(euler[i:i + 3])
for a in range(2, round(number**0.5)):
if number % a == 0:
break
else:
print(number),
break
如此奇怪地使用上面的代码,我可以找到正确的答案,即74274666391(需要4500万亿美元的编译(,但是当我测试3位代码的3位数字时,它给了我709281范围(3,6(。
我该如何修复?
第二部分。
这是一种算法,应该是找到质量数字的最快(https://en.wikipedia.org/wiki/wiki/primality_test((请参阅页面中间的伪code(。这是我的代码,但它不起作用,我进入无限循环。
for i in range(len(euler) - 3):
if (euler[i + 3]== '1' or euler[i + 3]== '3' or euler[i + 3]== '7' or euler[i + 3]== '9'):
number = int(euler[i:i + 3])
for y in range(2, number-1):
while y * y <= number:
if (number % y != 0 or number % (y+1) != 0):
break
我该如何修复?
在第一部分中,将'3'替换为'2',以便检查第三位数的奇数,而不是第四:
euler[i + 3]== '1' or euler[i + 3]== '3' or euler[i + 3]== '7' or euler[i + 3]== '9'):
更改为
euler[i + 2]== '1' or euler[i + 2]== '3' or euler[i + 2]== '7' or euler[i + 2]== '9'):
类似地,考虑for循环中应延伸到的范围(即LEN -2或LEN -3(,即使它不适用于此示例。
通常,完全避免使用魔法数字。定义变量或接受输入以集n = 3或10 ...
另外,您不会通过添加if
条件获得太多收益,而只有错误的可能性(如上所述(。过早优化是所有邪恶的根源
在第二部分中,当您break
您的内部循环时,您并没有真正建立任何原始性。您可以做一些简单的事情,例如设置标志。在这里,我修改了您的程序,以提供一个示例:
euler = '7182818284590452353602874713526624977572470936999595749669676277240766303535475945713821785251664274274663919320030599218174135966290435729003342952605956307381323286279434907632338298807531952510190115738341879307021540891499348841675092447614606680822648001684774118537423454424371075390777449920695517027618386062613313845830007520449338265602976067371132007093287091274437470472306969772093101416928368190255151086574637721112523897844250569536967707854499699679468644549059879316368892300987931277361782154249992295763514822082698951936680331825288693984964651058209392398294887933203625094431173012381970684161403970198376793206832823764648042953118023287825098194558153017567173613320698112509961818815930416903515988885193458072738667385894228792284998920868058257492796104841984443634632449684875602336248270419786232090021609902353043699418491463140934317381436405462531520961836908887070167683964243781405927145635490613031072085103837505101157477041718986106873969655212671546889570350354'
for i in range(len(euler) - 2):
if (euler[i + 2]== '1' or euler[i + 2]== '3' or euler[i + 2]== '7' or euler[i + 2]== '9'):
number = int(euler[i:i + 3])
for y in range(2, number-1):
isPrime = True
while y * y <= number:
if (number % y != 0 or number % (y+1) != 0):
isPrime = False # The number is not prime
break # Exit loop
if isPrime: # Nothing was able to factorize the number
print(number) # Print and leave
exit(0)
但是,您的代码真的很折断,并且可以对不同边缘案例进行大量关注和测试。
在第一部分中,您正在掌握Python中的右端非包含范围和切片的属性。但是,当您只是为了找到一个元素而索引时,您还是不在乎吗?我的意思是,第三位数字是在i+3
上真正在i
开始的数字吗?
对于您的第二部分,我没有看到您的代码和伪代码之间的映射。
一般而言。您可以将Prime_Check逻辑划分为返回真或错误的函数,并在每次获得数字时调用该功能,然后确定是否要打印并断开或继续。另外,您对1、3、7、9进行的比较,并用in
进行缩写。