emirp(向后拼写)是一个pime编号,其逆转也是素数。防爆。 71 & 71.我必须编写一个程序来显示前100个emirps。它可以显示每行10个号,并正确对齐的数字:按顺序倒退
2 3 5 7 11 13 17 31 37 71
73 79 97 101 107 113 131 149 151 157.
我没有线索我在做什么,如果任何人都可以倾倒下来,我很乐意。
emirp(向后拼写)是一个pime编号,其逆转也是素数。防爆。 71 & 71.我必须编写一个程序来显示前100个emirps。它可以显示每行10个号,并正确对齐的数字:按顺序倒退
2 3 5 7 11 13 17 31 37 71
73 79 97 101 107 113 131 149 151 157.
我没有线索我在做什么,如果任何人都可以倾倒下来,我很乐意。
这听起来像一般有两个问题:
将您的任务分解为更小的部分,然后您将能够更清楚地看到如何完成整个任务。
要找到emirps,先写了一些辅助功能:
is_prime()
来确定一个数字是否是质不是reverse_digits()
扭转任意数量的结合这些的数字两个函数,你可以想象一个循环,找到所有的素数都是正向和反向的。当您可以简单地生成这些数字的列表,并将它们打印到控制台,每行一行时,您的第一项任务就完成了。接下来,弄清楚你想要使用什么格式(它看起来像每个数字的一定数量的字符空间的固定格式是你需要的)。你知道你有100个数字,每行10个,所以如何格式化数字应该很简单。
下把问题分解成简单的子问题:
一旦你有一个简单的版本工作,你可能能够以某种方式优化它。
检查数字是否为素数的直接方法是尝试所有已知的素数小于它,看看它是否平均分配到该数字。
示例:要查找的第一对夫妇的素数
开始了与2号,这是主要因为只有除数本身和1,这意味着,只有这样才能多两个数字拿到2是2×的1.同样适用于3。
因此,我们用两个已知的素数2和3开始。为了检查下一个数字,我们可以检查4模2是否等于0.这意味着当2分为4时不存在余数,这意味着2是一个因子特别是我们知道2 x 2 = 4。因此4不是素数。
转到下一个数字:5.要检查五个,我们尝试5模2和5模3,两者都等于1。所以5是首要的,将它添加到我们的已知素数列表中,然后继续检查下一个数字。这个相当乏味的过程对于一台电脑来说非常棒。
等等等等 - 通过遍历所有先前找到的素数检查下一个数字,并检查它们是否平均分配,如果所有先前找到的素数不均匀分配,则有新的素数。重复。
你可以通过计算2来加速,因为所有偶数都可以被2整除。此外,另一个不错的技巧是你不必检查任何大于数字平方根的素数,因为任何大的数字都需要更小的素数因子。将你的循环减半。
所以这是您的算法来生成一个大的素数列表。
收集他们在一个阵列中的很大一部分,比如说第一个10000左右。然后遍历它们,反转数字并查看结果是否在您的数组中。如果是这样,你有一个emirp,继续,直到你得到前100个emirps
如果前10,000个素数不返回100 emirps。前进到下一个10,000。重复。
对于作业,我会用一个相当简单的isPrime
函数,伪代码沿着线:
def isPrime (num):
set testDiv1 to 2
while testDiv1 multiplied by testDiv1 is less than or equal to num:
testDiv2 = integer part of (num divided by testDiv1)
if testDiv1 multiplied by testDiv2 is equal to num:
return true
Add 1 to testDiv1
return false
这基本上检查的数量是否整除和的平方根的任何数量的2之间数字,原始素性检查。你停在平方根处的共振是因为如果它上面有一个,你会在它下面找到一个匹配。
例如100是2次50,4次25,5次20和10次10.下一次之后将是20次5但你不需要检查20次,因为它会在你检查5.任何正数都可以表示为另外两个正数的乘积,一个低于平方根,另一个高于正数(当然除了确切的平方根情况)。
下一个棘手的问题是数字的反转。 C有一些不错的功能,这将使它更容易为你的伪代码基本上是:
def reverseDigits (num):
set newNum to zero
while num is not equal to zero:
multiply newnum by ten
add (num modulo ten) to newnum
set num to the integer part of (num divided by ten)
return newNum
在C语言中,你可以使用int()
整数部分和%
为模运算符(什么是遗留下来的,当你把东西由别的东西 - 如47 % 10
是7
,9 % 4
是1
,1000 % 10
是0
等)。
的isEmirp
将是一个相当简单:
def isEmirp (num):
if not isPrime (num):
return false
num2 = reverseDigits (num)
if not isPrime (num2):
return false
return true
然后在最顶层,你的代码看起来是这样的:
def mainProg:
create array of twenty emirps
set currEmirp to zero
set tryNum to two
while currEmirp is less than twenty
if isEmirp (tryNum):
put tryNum into emirps array at position currEmirp
add 1 to currEmirp
for currEmirp ranging from 0 to 9:
print formatted emirps array at position currEmirp
print new line
for currEmirp ranging from 10 to 19:
print formatted emirps array at position currEmirp
print new line
没错,你应该能够得到一些有用的代码出于此,我希望。如果您对翻译有任何疑问,请发表评论,我会为您提供建议,而不是解决问题或做实际工作。
如果您尝试自己,即使您最初有很多麻烦,您也会学到更多。
我在代码块中插入了所需的输出,因此格式不会消失 - 现在查看它,期望的格式似乎有点......精神分裂症。这绝对是它应该如何对齐? – 2010-07-01 04:47:06
也许这不在问题的范围内,但emirps也不能是回文,所以2,3,5,6,11和101不是真正的emirps。 – 2010-07-01 05:38:03