鱼C论坛

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

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

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

special_prime_number = []

def identify_special_prime_number(x):
    flag2 = 0
    flag1 = identify_prime_number(i)
    if flag1 == 1:
        i_change = i*10+1
        flag2 = identify_prime_number(i_change)
    return flag2

special_prime_number = []

for i in range(1,101):
    flag_prime_number = identify_special_prime_number(i)
    if flag_prime_number == 1:
        special_prime_number.append(i)
            
#special_prime_number.pop(1)
special_prime_number = special_prime_number[1:]
print(special_prime_number)
#[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中。
def find_prime(n):
    prime = [2,3]
    for divident in range(5, n, 2):
        divisor = 2
        count = 0
        j = int(divident ** 0.5)
        while divisor <= j:
            if divident % divisor == 0:
                divisor += 1
                count += 1
            else:
                divisor += 1
        if count == 0:
            prime.append(divident)
    return prime
lis1 = find_prime(100)
lis2 = find_prime(1000)
result = []
temp = [i * 10 + 1 for i in lis1]
for j in temp:
    if j in lis2:
        result.append(j)
print(result)

评分

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

查看全部评分

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

使用道具 举报

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

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

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

使用道具 举报

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

        return True

if __name__ == '__main__':
        list1 = [i for i in range(1,100) if is_prime(i)]
        for i in list1:
                if is_prime(i*10 + 1):
                        print(i)
                

评分

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

查看全部评分

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

使用道具 举报

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

运行结果:
3
7
13
19
31
43
97

***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 编辑

题目多了感觉已经做过几遍了,现在速度比以前快多了
def fun(n=100):
    prime = [i for i in range(2, 10*n+2)
             if 0 not in (i%j for j in range(2, int(i**0.5)+1))]
    return [i for i in prime if i*10+1 in prime]
还有个给力的工具库
import gmpy2

def fun2(n=100):
    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在不在这个列表中,如果在就输出或放到一个新列表中统一输出。
lst1 = [2]
for i in range(3, 1000, 2):
    j = 0
    while lst1[j] * lst1[j] <= i:
        if i % lst1[j] == 0:
            break
        j += 1
    else:
        lst1.append(i)

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

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

使用道具 举报

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

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

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


3
7
13
19
31
43
97
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

for i in range(2, 101):
    if isprime(i) and isprime(i*10+1):
        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 | 显示全部楼层
def prime_num(num):
    n = 2
    while n <= (num//2):
        if num % n == 0:
            return False
        n += 1
    return True


def fishc159(num):
    if prime_num(num):
        temp = num * 10 +1
        if prime_num(temp):
            print num

for i in range(1,100):
    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, 2025-1-18 04:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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