Форум » Обработка целых чисел » 5061 25 » Ответить

5061 25

Ar3turrr: Как можно оптимизировать код(он ищет только числа)? Первый фор ищет все простые делители и добавляет их в divlist. [pre2]dividers = 0 divlist = [] for i in range(2, 10 ** 6): if int(i ** 0.5) != i ** 0.5: for k in range(1, int(i ** 0.5) + 1): if i % k == 0: dividers += 1 if dividers > 1: dividers = 0 break if dividers == 1: dividers = 0 divlist.append(i) m = '' for j in range(2352000, 10 ** 8): for g in range(0, len(divlist)): if j % divlist[ g] == 0: m += str(divlist[ g]) if m[ 0] != '10': m = '' break if len(m) >= 4: if m[ 0] == '1' and m[ 1] == '0' and m[ -2:] == '29': print(m) m = ''[/pre2]

Ответов - 2

sgglazkov: Меня хватило на такое, работает секунд за 5-10. Функция prime проверяет число на простоту. Функция primve_divs возвращает записанные по возрастанию простые делители. Остальной код просто перебор, думаю понятно. [pre2]def prime(x): for i in range(2, int(x ** 0.5) + 1): if x % i == 0: return False return True def prime_divs(x): divs = [] for i in range(2, int(x ** 0.5) + 1): if x % i == 0: if prime(i): divs.append(i) if i * i != x and prime(x // i): divs.append(x // i) if len(divs) > 0: divs.sort() result = '' for d in divs: result += str(d) return result, divs[-1] return '0', 0 for number in range(2352000, 2400000): mask, mx = prime_divs(number) if str(mask)[:2:] == '10' and str(mask)[-2::] == '29': print(number, mx) [/pre2]

s11kai: sgglazkov пишет: [pre2]def prime(x): for i in range(2, int(x ** 0.5) + 1): if x % i == 0: return False return True def prime_divs(x): divs = [] for i in range(2, int(x ** 0.5) + 1): if x % i == 0: if prime(i): divs.append(i) if i * i != x and prime(x // i): divs.append(x // i) if len(divs) > 0: divs.sort() result = '' for d in divs: result += str(d) return result, divs[-1] return '0', 0 for number in range(2352000, 2400000): mask, mx = prime_divs(number) if str(mask)[:2:] == '10' and str(mask)[-2::] == '29': print(number, mx) [/pre2] Хорошее решение, но, имеет несколько технических ошибок или практических недостатков, это кому как покажется... Во-первых, предложенный цикл for number in range(2352000, 2400000): влечет сразу две ошибки: 1) из условия следует, что нужно найти: «Среди натуральных чисел, больших 2352000» 2) верхняя граница исследуемого диапазона нам неизвестна Во-вторых, алгоритм печатает 6 значений, откуда следует третья ошибка, поскольку 3) по условию: «В ответе укажите первые 5 найденных…» Переработанный ниже алгоритм, исключает все выше указанные недостатки при исходном количестве строк: [pre2] def prime(x): return x > 1 and all( x % d != 0 for d in range(2,round(x**0.5)+1) ) def prime_divs(x): divs = [] for i in range(2, int(x ** 0.5) + 1): if x % i == 0 and prime(i): divs.append(i) if i * i != x and prime(x // i): divs.append(x // i) if len(divs) > 0: divs.sort() result = '' for d in divs: result += str(d) return result, divs[-1] return '0', 0 number = 2352000+1 k = 1 while True: mask, mx = prime_divs(number) if str(mask)[:2:] == '10' and str(mask)[-2::] == '29': print(number, mx) if k<5: k+=1 else: break number += 1 [/pre2] Впрочем, я могу и ошибаться, в таком случае, поправьте меня



полная версия страницы