diff --git a/solutions/0049.PrimePermutations/euler_49.py b/solutions/0049.PrimePermutations/euler_49.py new file mode 100644 index 0000000..9bb614c --- /dev/null +++ b/solutions/0049.PrimePermutations/euler_49.py @@ -0,0 +1,85 @@ +""" +The arithmetic sequence, 1487,4817,8147, in which each of the terms increases by 3330, +is unusual in two ways: (i) each of the three terms are prime, and, (ii) each of the +4-digit numbers are permutations of one another. + +There are no arithmetic sequences made up of three 1-, 2-, or 3-digit primes, exhibiting this property, +but there is one other 4-digit increasing sequence. + +What 12-digit number do you form by concatenating the three terms in this sequence? +""" + +import time + + +def timer(func): + def wrapper(*args, **kwargs): + start_time = time.time() + result = func(*args, **kwargs) + end_time = time.time() + elapsed_time = end_time - start_time + print(f"{func.__name__} time: {elapsed_time:.6f} seconds") + return result + + return wrapper + + +def list_primes(start: int, end: int) -> list[int]: + # 只需要筛到 sqrt(9999) ≈ 100 即可标记合数 + limit = int(end**0.5) + 1 + base_primes = [True] * limit + base_primes[0] = base_primes[1] = False + + # 生成基础质数(2到100) + for i in range(2, int(limit**0.5) + 1): + if base_primes[i]: + for j in range(i * i, limit, i): + base_primes[j] = False + + # 分段筛:只标记1000-9999范围 + size = end - start + 1 + is_prime = [True] * size + + for p in range(2, limit): + if base_primes[p]: + # 找到第一个大于等于start的p的倍数 + first = max(p * p, ((start + p - 1) // p) * p) + for j in range(first, end + 1, p): + is_prime[j - start] = False + + return [i + start for i, val in enumerate(is_prime) if val] + + +def list_com(a: list, b: list) -> bool: + if len(set(a)) != len(set(b)): + return False + xb = b.copy() + for x in a: + if x not in xb: + return False + else: + xb.remove(x) + return True + + +@timer +def main(): + primes = list_primes(1000, 9999) + max_sp = max(primes) + res = [] + for i, v in enumerate(primes): + if v == max_sp: + break + gap = int((max_sp - v) / 3) + for g in range(gap, (primes[i + 1] - v - 1), -1): + if v + g in primes and v + 2 * g in primes: + if list_com(list(str(v)), list(str(v + g))): + if list_com(list(str(v)), list(str(v + 2 * g))): + res.append(str(v) + str(v + g) + str(v + 2 * g)) + else: + continue + print(res) + + +if __name__ == "__main__": + main()