数素数

题目描述:令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。

tips:素数判断:只能被1和自身整除。判断方法:不能被2到\sqrt{n}之间的任何数整除,数字2除外。偶数必然不是素数(除了2),所以判断时可以从3开始,每次递增2,可以不用判断偶数。

输入描述:

输入在一行中给出M和N,其间以空格分隔。

tips:M表示第M个素数,N表示第N个素数,要求输出第M个和第N个素数之间的所有素数

求解时求出第一个到第N个素数,从第M个开始输出

输出描述

输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。

tips:注意最后一个数的输出格式,需要换行

输入

5 27

输出

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103

方法一:

import math
def judgeprime(num):
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True


nums = list(map(int, input().split(' ')))
count = 1
num = 3
prime = ["2"]
while count < nums[1]:
    if judgeprime(num):
        prime.append(str(num))
        count += 1
    num += 2


 index = 0
 for i in range(nums[0]-1, len(sushu)):
     index += 1
     if index % 10 == 0:
         print(sushu[i])
     elif i == len(sushu)-1:
         print(sushu[i])
     else:
         print(sushu[i], end=' ')

附上大佬的代码:妙啊

#Author:华科平凡

import math
def isPrime(n):
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True

while True:
    try:
        res = ["2"]   #以字符方式存储,便于输出格式符合题目要求
        start = 3
        a,b=map(int,input().split())
        while len(res) < b:
            if isPrime(start):
                res.append(str(start))
                start += 2    #递增2,减少判断次数
        for i in range(a-1,b,10):
            print(" ".join(res[i:i+10]))
    except:
        break

solution

import math

def judgeprime(num):
    for i in range(2, int(math.sqrt(num))+1):
        if num % i == 0:
            return False
    return True

nums = list(map(int, input().split(' ')))
count = 1
num = 3
prime = ["2"]
while count < nums[1]:
    if judgeprime(num):
        prime.append(str(num))
        count += 1
    num += 2

for i in range(nums[0]-1, nums[1], 10):
    print(" ".join(prime[i:i+10]))

方法二:倒是可以不需要从2,直接试除到根号 n。快速某个数是不是素数,只需要判断这个数是否可以被小于这个数的平方根素数整除即可。  因为素数的数量不多(相对所有的都尝除一遍),所以速度会快很多。

# 链接:https://www.nowcoder.com/questionTerminal/e0fb49acb75f47e8b6fa2077d9071799
# 来源:牛客网
#作者:大虫航

#coding=utf-8
M, N = map(int, input().split(" "))
Max = 10000000


def find(M, N):
    ans = [0, 2]
    for i in range(3, Max):
        if len(ans) > N:
            break
        j = 1
        flag = 1
        while ans[j] <= i**0.5:
            if i % ans[j] == 0:   #能被整除  立马退出不用看其他的
                flag = 0
                break
            j += 1
            if flag:
                ans.append(i)
        return ans


ans = find(M, N)
i = M
count = 1
while i <= N:
    if count % 10 == 0:
        print(ans[i])
    else:
        print(ans[i])
    count += 1
    i += 1

集成版:

import math
def judge(num, prime):
    i = 0
    while int(prime[i]) <= math.sqrt(num):
        if num % int(prime[i]) == 0:
            return False
        i += 1
    return True

prime = ["2"]
m, n = map(int, input().split(' '))
count = 1
num = 3
while count < n:
    if judge(num, prime):
        prime.append(str(num))
        count += 1
    num += 2

for i in range(m-1, n, 10):
    print(" ".join(prime[i:i+10]))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值