хочу найти число с самыми простыми делителями, но он продолжает печатать последнее введенное число и его делители - PullRequest
0 голосов
/ 02 июля 2019

цель состоит в том, чтобы подсчитать простые делители трех чисел и напечатать число с самыми простыми делителями и его числом простых делителей, но мой код продолжает печатать третье число и его число делителей, даже если это не тот, у которого большепростые делители, что мне делать?

l = []
for i in range(0, 3):
    x = int(input())
    l.append(x)
def prime_counter(n):
    b = 1
    l1 = []
    while b <= n:
        k = 0
        if n % b == 0:
            j = 1
            while j <= b:
                if b % j == 0:
                    k = k + 1
                j = j + 1
            if k == 2:
                l1.append(b)
        b = b + 1
    return l1
for i in range(0, len(l)):
    l2 = []
    if len(prime_counter(l[i])) > len(l2):
        l2 = prime_counter(l[i])

print(l[i], len(l2))

Ответы [ 3 ]

1 голос
/ 02 июля 2019

Прежде всего, вы можете упростить свой номер prime_counter(), удалив цикл for:

def prime_counter(n):
    l1 = []
    for b in range(1,n+1):
        if n % b == 0:
            l1.append(b)
    return l1

Далее, вы можете использовать понимание списка для более быстрого вычисления числа простых чисел:

import numpy as np

l = []
for i in range(0, 3):
    x = int(input())
    l.append(x)

# We save the number of divisors for each number of l    
number_prime_divisor = [len(prime_counter(x)) for x in l]

# Now we just have to look the index with the max number of prime divisors
# using np.argmax
l[np.argmax(number_prime_divisor)]

Простой пример:

l = [4,5,6]

number_prime_divisor = [len(prime_counter(x)) for x in l]
print(number_prime_divisor)
[3, 2, 4]

print(l[np.argmax(number_prime_divisor)])
6
0 голосов
/ 02 июля 2019

Здесь вы можете значительно упростить свою логику и повысить производительность, внедрив рекурсивную функцию:

def prime_counter(n, pd, out):

    quot = n/pd

    if quot==1:
        out.append(pd)
        return out
    if int(quot)==quot:
        out.append(pd)
        return prime_counter(quot, 2, out)
    else:
        return prime_counter(n, pd+1, out)

numbers = [12,25,100]

test = {n: prime_counter(n, 2, []) for n in numbers}

Урожайность:

{12: [2, 2, 3], 25: [5, 5], 100: [2, 2, 5, 5]}

Тогда просто определить число с наибольшим числом простых делителей, а также количество простых делителей (вы захотите уточнить, как вы собираетесь разорвать связи):

most_primes = max(test, key=lambda x: len(test[x]))
number_of_primes = len(test[most_primes])

Дает:

100
4
0 голосов
/ 02 июля 2019

В этой части кода вы перезаписываете l2 с [] перед каждым сравнением:

for i in range(0, len(l)):
  l2 = []
  if len(prime_counter(l[i])) > len(l2):
      l2 = prime_counter(l[i])

Итак:

len(prime_counter(l[i])) > len(l2)

будет истинным, пока prime_counter возвращает aсписок с одним или несколькими элементами, потому что l2 пусто

Чтобы исправить это, инициализируйте l2 перед циклом for и сохраните i во вспомогательной переменной

l2 = []
max_pos = 0
for i in range(0, len(l)):
  if len(prime_counter(l[i])) > len(l2):
      l2 = prime_counter(l[i])
      max_pos = i
print(l[max_pos], len(l2)) 
...