【问题标题】:Circular Prime Numbers without sieve algorithm or libraries in PythonPython中没有筛算法或库的循环素数
【发布时间】:2019-01-31 22:34:43
【问题描述】:

数字 197 被称为圆素数,因为数字的所有旋转:197、971 和 719 本身都是素数。

100 以下的素数有 13 个:2、3、5、7、11、13、17、31、37、71、73、79 和 97。

一百万以下有多少个圆素数?

我正在尝试做 Project Euler #35,但在想出一个不实现任何外部库或筛子算法的解决方案时遇到了麻烦。

为了尽量保持基本,我创建了一些函数来旋转一个数字并检查它是否是素数。尝试组合这两个函数后,我遇到了数据类型问题,并且在管理 int 和 strs 之间的数据类型时遇到了麻烦,因为它们与我用来存储每次旋转的列表对象相关。

我的代码:

def is_prime(n):
    m = int(n)
    for i in range(2,m-1):
            if (m%i) == 0:
                    return False
    return (True if m>1 else False)

def rotate(n):
    list = []
    string = str(n)
    for i in string:
        front = string[0]
        rest = string[1:]
        complete = rest + front
        list.append(complete)
        string = complete
    return list 

def rotations(num):
  numString = str(num)
  counter = 0 
  while counter < len(numString): 
    for i in numString:
      rotater = rotate(i)
      if is_prime(rotater) in numString == True: 
        counter+=1 
  return counter

print(rotations(1000))

按原样返回:

Traceback (most recent call last):
  File "/tmp/785402618/main.py", line 29, in <module>
    print(rotations(1000))
  File "/tmp/785402618/main.py", line 25, in rotations
    if is_prime(rotater) in numString == True: 
  File "/tmp/785402618/main.py", line 2, in is_prime
    m = int(n)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'

我该如何解决这个问题?

【问题讨论】:

  • 有什么错误?
  • 嗨!欢迎来到堆栈溢出。你有什么问题?
  • is_prime(rotater) 返回True/Falseif is_prime(rotater) in numString == True: 应该检查什么?
  • 正如@Carcigenicate 所说,如果Boolean in Boolean 作为in 比较的一部分返回True/False,那么评估是没有意义的。
  • 您可以找到更多寻找“python 旋转字符串”的答案。对于 euler 项目,最好自己弄清楚数学。通常是为了找到更有效的方法。现在你会检查 is_prime 太多,而且它也不是最有效的。

标签: python


【解决方案1】:

与其在字符串和整数之间来回切换,只在整数中工作更容易(也更快)。通过取模 10 从数字中提取最后一位数字。使用整数除以 10 保留其余数字。将最后一位数字提高到 10 的适当幂(取剩余数字的对数)并将其添加到其余数字位数。这使您可以旋转原始数字。

您的is_prime 函数可以通过在传递n 的平方根时停止循环来改进。如果 n 是合数,则它的至少一个因数必须小于或等于它的平方根;例如,如果 n = p × q,那么 pq等于平方根,或者其中一个小于平方根,另一个大于平方根。

我会留给您将这些想法简化为代码。

【讨论】:

    【解决方案2】:

    多个数字,数字相加,得到数字的个数。将相关的三组结果存储为字符串。然后比较每个字符串的结果。

    E.g:   137 maps to "(21, 11, 3)" 
           173 maps to "(21, 11, 3)" 
    

    然后,您只需从索引为素数的数组 A 中获取每个字符串的索引。

     j = 0;
     For or while loop:
          j = A.indexOf(someString, j+1);
    

    对于索引 j,您希望下一次出现 someString。

    【讨论】:

      猜你喜欢
      • 2017-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多