鱼C论坛

 找回密码
 立即注册
楼主: 冬雪雪冬

[技术交流] Python:每日一题 159

[复制链接]
发表于 2018-3-8 10:23:54 | 显示全部楼层
想的思路很快,但是编程还是花了15分钟左右,感觉自己的编程能力还是要加强。。 关于质数的定义那一块可以有很多种方法,我还是选的一种感觉最笨但是很好理解的方法。。
  1. #先定义质数的判断函数
  2. def identify_prime_number(x):
  3.     flag = 1
  4.     #判断x是否是质数
  5.     for k in range(2,x):
  6.         if x%k == 0 :
  7.             flag = 0
  8.             break
  9.     return flag

  10. special_prime_number = []

  11. def identify_special_prime_number(x):
  12.     flag2 = 0
  13.     flag1 = identify_prime_number(i)
  14.     if flag1 == 1:
  15.         i_change = i*10+1
  16.         flag2 = identify_prime_number(i_change)
  17.     return flag2

  18. special_prime_number = []

  19. for i in range(1,101):
  20.     flag_prime_number = identify_special_prime_number(i)
  21.     if flag_prime_number == 1:
  22.         special_prime_number.append(i)
  23.             
  24. #special_prime_number.pop(1)
  25. special_prime_number = special_prime_number[1:]
  26. print(special_prime_number)
  27. #[3, 7, 13, 19, 31, 43, 97]            
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 10:40:17 | 显示全部楼层
list1 = []
i =2
for i in range(2,101):
    j =2
    for j in range(2,i):
        if i%j==0:
            break
        
    else:
        k =2
        for k in range(2,(i*10+1)):
            if (i*10+1) % k ==0:
            
                break
        else:
            list1.append(i*10+1)
print(list1)
        写的不好 求大神指点一下

点评

不错,效率可以再提高些。  发表于 2018-3-8 20:25

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 13:21:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-8 14:30:55 | 显示全部楼层
定义一个求质数的函数,分别求出100,1000以内的质数,构成lis1和lis2,lis1中的元素乘10+1后,判断是否在lis2中。
  1. def find_prime(n):
  2.     prime = [2,3]
  3.     for divident in range(5, n, 2):
  4.         divisor = 2
  5.         count = 0
  6.         j = int(divident ** 0.5)
  7.         while divisor <= j:
  8.             if divident % divisor == 0:
  9.                 divisor += 1
  10.                 count += 1
  11.             else:
  12.                 divisor += 1
  13.         if count == 0:
  14.             prime.append(divident)
  15.     return prime
  16. lis1 = find_prime(100)
  17. lis2 = find_prime(1000)
  18. result = []
  19. temp = [i * 10 + 1 for i in lis1]
  20. for j in temp:
  21.     if j in lis2:
  22.         result.append(j)
  23. print(result)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 15:58:39 | 显示全部楼层
  1. import math as m

  2. def isPrime(x):
  3.     if x == 2 or x == 3:
  4.         return 1;
  5.     if x % 6 != 5 and x % 6 != 1:
  6.         return 0;
  7.     temp = int(m.sqrt(x))
  8.     for each in range(5,temp,6):
  9.         if x % each == 0 or x % (each + 7) == 0:
  10.             return 0;
  11.     return 1;

  12. for i in range(2,100):
  13.     if isPrime(i) and isPrime(i*10+1):
  14.         print(i)
复制代码
  1. 3
  2. 7
  3. 13
  4. 19
  5. 25
  6. 31
  7. 37
  8. 43
  9. 49
  10. 61
  11. 79
  12. 91
  13. 97
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 16:01:13 | 显示全部楼层
  1. import math
  2. def is_prime(number):
  3.         if number == 1:
  4.                 return False
  5.         if number == 2:
  6.                 return True
  7.         for i in range(2,int(math.sqrt(number)+1)):
  8.                 if number % i == 0:
  9.                         return False

  10.         return True

  11. if __name__ == '__main__':
  12.         list1 = [i for i in range(1,100) if is_prime(i)]
  13.         for i in list1:
  14.                 if is_prime(i*10 + 1):
  15.                         print(i)
  16.                
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 16:02:33 | 显示全部楼层


  1. 运行结果:
  2. 3
  3. 7
  4. 13
  5. 19
  6. 31
  7. 43
  8. 97

  9. ***Repl Closed***
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 16:25:28 | 显示全部楼层
m=[]
l=[]
for a in range(2,101):
    if a==2:
       m.append(a)
    else:
        if 0 not in [a%b for b in range(2,a)] :
                m.append(a)
for n in m:
    if 0 not in [(10*n+1)%c for c in range(2,10*n)]:
        l.append(n)
print(l)


               

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 16:53:54 | 显示全部楼层
本帖最后由 sukiwhip 于 2018-3-8 16:56 编辑

prime_number = []
prime_number2 = []

for i in range(1,101):#先拿出一百以内的质数
   c = 0
   for j in range(1,i+1):
      b = i % j
      if b == 0 :
         c += 1
   if c == 2:
      prime_number.append(i)

long = len(prime_number)

for k in range(0,long):
   c = 0
   e = prime_number[k]*10 + 1#用来判断的数
   for l in range(1,e + 1):#再判断一次质数的条件
      d = e % l
      if d == 0 :
         c += 1
   if c == 2:
      prime_number2.append(prime_number[k])

print('这样的质数还有:' + str(prime_number2))


哎。。。判断一个数是不是质数应该先打包成函数的。。。下次再改进

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 17:57:35 | 显示全部楼层
#质数
for j in range(2,100):
    j1=j*10+1
   
    for i in range(2,j1):
        
        if j1%i==0:
            break
    else :
            print(j)
        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 18:24:24 | 显示全部楼层
本帖最后由 solomonxian 于 2018-3-8 18:25 编辑

题目多了感觉已经做过几遍了,现在速度比以前快多了
  1. def fun(n=100):
  2.     prime = [i for i in range(2, 10*n+2)
  3.              if 0 not in (i%j for j in range(2, int(i**0.5)+1))]
  4.     return [i for i in prime if i*10+1 in prime]
复制代码

还有个给力的工具库
  1. import gmpy2

  2. def fun2(n=100):
  3.     return [i for i in range(2, n+1) if all(map(gmpy2.is_prime, [i, i*10+1]))]
复制代码

人这么多,我发我的答案,楼主你直接看对不对好了,用不着测代码
[3, 7, 13, 19, 31, 43, 97]

点评

没功力了,明天在评分。  发表于 2018-3-8 20:30

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 20:04:02 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-8 20:37:35 | 显示全部楼层
评分结束。
说说我的思路。
先建立一个列表,存放1000以内的所有质数(100以内最大质数*10+1不会大于1000).
由于有了质数列表,不用计算所有的被除数,只要看看能否被列表中小于等于被测数平方根的质数整除就可以了。
后面就简单了,看看质数*10+1在不在这个列表中,如果在就输出或放到一个新列表中统一输出。
  1. lst1 = [2]
  2. for i in range(3, 1000, 2):
  3.     j = 0
  4.     while lst1[j] * lst1[j] <= i:
  5.         if i % lst1[j] == 0:
  6.             break
  7.         j += 1
  8.     else:
  9.         lst1.append(i)

  10. lst2 = []
  11. for i in lst1:
  12.     if i > 100:
  13.         break
  14.     if i * 10 + 1 in lst1:
  15.         lst2.append(i)

  16. print(lst2)
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 21:24:13 | 显示全部楼层
  1. import math

  2. def IsPrime(num):
  3.     tem = math.sqrt(num)
  4.     if num ==2 or num ==3:
  5.         return 1
  6.     if num % 6 !=1 and num % 6 !=5:
  7.         return 0
  8.     for each in range(5,int(tem)+1,6):
  9.         if num % each == 0 or num % (each + 2) == 0:
  10.             return 0;
  11.     return 1

  12. for n in range(2,100):
  13.     if IsPrime(num = n) and IsPrime(num = 10*n + 1):
  14.         print(n)


  15. 3
  16. 7
  17. 13
  18. 19
  19. 31
  20. 43
  21. 97
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 21:25:56 | 显示全部楼层
  1. '''
  2. 对于质数大家都很熟悉,从中可以发现某些质数乘以10再加1得到的仍然是质数,
  3. 例如3, 3 * 10 + 1 = 31, 31仍是质数。
  4. 当然这样的数还有不少,求出100以内这样的质数。
  5. '''
  6. def isPrime(n):
  7.     if n<2:
  8.         return False
  9.     elif n==2:
  10.         return True
  11.     else:
  12.         for i in range(2,n):
  13.             if n%i==0:
  14.                 return False
  15.         return True

  16. for n in range(1,100):
  17.     if isPrime(n):
  18.         if isPrime(n*10+1):
  19.             print(n)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-8 22:07:56 | 显示全部楼层
本帖最后由 checkily 于 2018-3-8 22:22 编辑
  1. def isprime(n):
  2.     for i in range(2, n):
  3.         if not n%i:
  4.             return False
  5.     else:
  6.         return True

  7. for i in range(2, 101):
  8.     if isprime(i) and isprime(i*10+1):
  9.         print(i,end='')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 00:14:19 | 显示全部楼层
def ZhiShu(n):
    if n == 2:
        return 1
    else:
        for i in range(2,n):
            if n % i == 0:
                return 0
        return 1
               
            
            

for a in range(1,101):
    if ZhiShu(a) == 1:
        s = a*10+1
        if ZhiShu(s) == 1:
            print(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 10:49:33 | 显示全部楼层
本帖最后由 pillar 于 2018-3-9 12:41 编辑

"方法一:"
def Daily_practice_159(n):   
    a = n//2      #   对该数除二取整
    for i in range(2,a+2):
        "判断质数只需判断这个数的前二分子一就可以了"
        if n%i ==0:
            break
    else:
        return  n
   

for n in range (2,100):
    if Daily_practice_159(n) and Daily_practice_159(n*10+1):
        print(n)
#            
Daily_practice_159(n)


“方法二:”
def Daily_practice_159():

    for i in range(2,100):
        j = 2
        a = i//2
        for j in range(2,a+2):
#        while j <= a+1:
            if i%j == 0:               
                break
#        j += 1
        else:
            b=i*10+1
            k=2
            for k in range(2,b//2+1):
                if b%k == 0:
                    break
#            k += 1
            else:
                print(i)              
         
            
Daily_practice_159()   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 17:35:14 | 显示全部楼层
  1. def prime_num(num):
  2.     n = 2
  3.     while n <= (num//2):
  4.         if num % n == 0:
  5.             return False
  6.         n += 1
  7.     return True


  8. def fishc159(num):
  9.     if prime_num(num):
  10.         temp = num * 10 +1
  11.         if prime_num(temp):
  12.             print num

  13. for i in range(1,100):
  14.     fishc159(i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-9 18:57:28 | 显示全部楼层
冬雪雪冬 发表于 2018-3-8 20:37
评分结束。
说说我的思路。
先建立一个列表,存放1000以内的所有质数(100以内最大质数*10+1不会大于1000 ...

你这是用了质因数,效率比一路循环上去高啊,
之前jerry说有个最快的方法,忘了
我就顾着写得快···话说评分就刚好停我那吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 06:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表