python中没有筛选算法或库的循环质数

时间:2019-01-31 22:34:43

标签: python

  

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

     

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

     

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

我正在尝试做Project Euler #35,但是在想出一种解决方案时遇到了麻烦,该解决方案没有实现任何外部库或筛选算法。

我尝试保持一些基本功能,以创建一个旋转数字并检查其是否为质数的函数。尝试将两个函数结合使用时,我遇到了数据类型问题,并且在管理int和str之间的数据类型时遇到了麻烦,因为它们与我用来存储每次旋转的列表对象相关。

我的代码:

    A  B ID         E
1: a1 b2  3 0.6211421
2: a2 b2  4 0.7421095
3: a1 b2  3 0.3943915
4: a1 b1  1 0.4069439
5: a2 b2  4 0.7796073
6: a1 b2  3 0.5505793
7: a1 b1  1 0.3526222
8: a2 b2  4 0.6906605
9: a1 b1  1 0.2337894

aTempDF <- melt(dT, id.vars = c("A", "B", "ID")) )

    A  B  ID variable    value
1: a1 b2  3        E 0.6211421
2: a2 b2  4        E 0.7421095
3: a1 b2  3        E 0.3943915
4: a1 b1  1        E 0.4069439
5: a2 b2  4        E 0.7796073
6: a1 b2  3        E 0.5505793
7: a1 b1  1        E 0.3526222
8: a2 b2  4        E 0.6906605
9: a1 b1  1        E 0.2337894

aTempDF%>%spread(variable, value)

Error: Duplicate identifiers for rows (4, 7, 9), (1, 3, 6), (2, 5, 8)

原样,它返回:

    A  B  ID       E1           E2           E3
1: a1 b2  3        0.6211421    0.3943915    0.5505793
2: a2 b2  4        0.7421095    0.7796073    0.6906605 
3: a1 b1  1        0.4069439    0.3526222    0.2337894

我该如何解决?

2 个答案:

答案 0 :(得分:0)

与其在字符串和整数之间来回移动,不如(而且更快)仅在整数中工作。通过将其取为mod 10来从数字中提取最后一位数字。使用整数除以10来保留其余数字。将最后一位数字提高到10的适当幂(取剩余数字的对数),然后将其加到其余的数字上数字。这样就可以轮流使用原始编号。

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

我将把这些想法简化为代码。

答案 1 :(得分:0)

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

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 的下一次出现。