1152 Google Recruitment(模拟,注意一个小细节即可)
def is_prime(x): # 试除法判断是否是质数
if x < 2:
return False
for i in range(2,int(x ** 0.5) + 1):
if x % i == 0:
return False
return True
l,k = map(int,input().split())
s = input()
"""
注意不能写成range(l)了,因为题目有说明必须要是k位连续字符,如果写成range(l),
那么最后s[i:i + k]截取到的就不是k位了
"""
for i in range(0,l - k + 1):
substr = s[i:i + k]
number = int(substr)
if is_prime(number):
print(substr)
exit(0)
print(404)
s = "0002"
print(s[2:10]) # 输出02,越界则截取到最后一个字符
判断是否是质数那里还可以优化一下,本题K最大可以取到9,所以判断是否是质数的最大数为9个9的数,为$10^9 - 1$,因此如果要先把从2 ~ $10 ^ 9 - 1$的所有质数筛出来肯定超时,因此优化可以从试除法判断质数那里优化,常规的试除法判断x是否是质数是从2开始枚举到$\sqrt{x}$,但是实际上并不需要枚举从2开始枚举到$\sqrt{x}$的所有数,只需枚举从2开始枚举到$\sqrt{x}$当中的质数即可(可以通过分解质因数去理解,一个合数是可以分解质因数的),因此可以先通过线性筛指数去筛从2 ~ $\sqrt{10^9 - 1}$的所有的质数,然后用优化版的试除法判断是否是质数
N = int(10 ** 4.5) + 10
st = [False] * N
primes = []
def get_primes(n):
for i in range(2,n):
if not st[i]:
primes.append(i)
j = 0
while primes[j] * i <= n:
st[primes[j] * i] = True
if i % primes[j] == 0:
break
j += 1
n = int(10 ** 4.5)
get_primes(n)
def is_prime(x): # 试除法判断是否是质数
if x < 2:
return False
for prime in primes:
if prime >= x: # 这个判断一定要有
break
if x % prime == 0:
return False
return True
l,k = map(int,input().split())
s = input()
"""
注意不能写成range(l)了,因为题目有说明必须要是k位连续字符,如果写成range(l),
那么最后s[i:i + k]截取到的就不是k位了
"""
for i in range(0,l - k + 1):
substr = s[i:i + k]
number = int(substr)
if is_prime(number):
print(substr)
exit(0)
print(404)