2010-07-01 78 views
1

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. 

我没有线索我在做什么,如果任何人都可以倾倒下来,我很乐意。

+0

我在代码块中插入了所需的输出,因此格式不会消失 - 现在查看它,期望的格式似乎有点......精神分裂症。这绝对是它应该如何对齐? – 2010-07-01 04:47:06

+0

也许这不在问题的范围内,但emirps也不能是回文,所以2,3,5,6,11和101不是真正的emirps。 – 2010-07-01 05:38:03

回答

5

这听起来像一般有两个问题:

  1. 寻找emirps。
  2. 根据需要格式化输出。

将您的任务分解为更小的部分,然后您将能够更清楚地看到如何完成整个任务。

要找到emirps,先写了一些辅助功能:

  • is_prime()来确定一个数字是否是质不是
  • reverse_digits()扭转任意数量的

结合这些的数字两个函数,你可以想象一个循环,找到所有的素数都是正向和反向的。当您可以简单地生成这些数字的列表,并将它们打印到控制台,每行一行时,您的第一项任务就完成了。接下来,弄清楚你想要使用什么格式(它看起来像每个数字的一​​定数量的字符空间的固定格式是你需要的)。你知道你有100个数字,每行10个,所以如何格式化数字应该很简单。

+1

不应该是semirps? – Tom 2010-07-01 05:24:57

+0

@Tom是不是双倍数?无论是semirp还是emirps。 – JAL 2010-07-01 05:38:33

+0

thnx我真的很感激。 – John 2010-07-01 05:47:41

2

下把问题分解成简单的子问题:

  1. 首先,你需要检查一个数是否为素数。这是一个很常见的任务,你可以很容易地谷歌它 - 或尝试一个天真的执行自己,这可能是更好的,因为这是作业。其次,你需要反转一个数字的数字。我建议你先在一张纸上找出一个算法,然后在代码中实现它。
  2. 把两者放在一起 - 它不应该那么辛苦。
  3. 正确设置结果格式。每行打印10个数字是一旦剩下的工作完成后,你应该能够轻松搞定。

一旦你有一个简单的版本工作,你可能能够以某种方式优化它。

0

检查数字是否为素数的直接方法是尝试所有已知的素数小于它,看看它是否平均分配到该数字。

示例:要查找的第一对夫妇的素数

开始了与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。重复。

0

对于作业,我会用一个相当简单的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 % 107,9 % 41,1000 % 100等)。

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 

没错,你应该能够得到一些有用的代码出于此,我希望。如果您对翻译有任何疑问,请发表评论,我会为您提供建议,而不是解决问题或做实际工作。

如果您尝试自己,即使您最初有很多麻烦,您也会学到更多。