ali
ali

Reputation: 1

How to find number in list which has the biggest number of prime?

I want to write a program that receives 10 entries and at the end it should print the number that has the greatest number of prime factors along with the number of its prime factors in the output. And, if some of the inputs have the same condition, the program will print the biggest one.

The code that I wrote executed all conditions except the final condition. How should I write a code for a case where two numbers have the same numbers of prime factors (when I want the bigger number to be my output)? For example both 678 and 84 have 3 prime factors . The output of my code is 84, while I want the output to be 678 (the bigger number).

input: 123 43 54 12 76 84 98 678 543 231
Correct output: 678 3
but my output: 84 3

a = [0,0,0,0,0,0,0,0,0,0]
#a = [123,43,54,12,76,84,98,678,543,231]
b = [0,0,0,0,0,0,0,0,0,0]


def is_first (number):
    Prime_number= 0
    for m in range(1, (number //2)+1, 1):
        if number % m == 0:
                Prime_number += 1
    if    Prime_number > 1:
        is_prime = 0
    else:
        is_prime = 1
    return is_prime

for i in range(0,10,1):
    a[i] = input()

for j in a:
    numbers= 0
    for k in range(2, int(j)//2, 1):
        if int(j) % k == 0:
            if is_first (k) == 1:
                numbers += 1
    b[a.index(j)] = numbers

index_of_same = [i for i, e in enumerate(b) if e == max(b)]
n = []
for t in index_of_same:
    n.append(a[t])

print(str(max(n))+ ' ' + str(max(b)))

Upvotes: 0

Views: 69

Answers (2)

goodvibration
goodvibration

Reputation: 6206

Your code is cumbersome IMO, so I'd like to suggest a simpler version:

def getNumOfFactors(n):
    num = 0
    factor = 1
    while n > 1:
        factor += 1
        if n % factor == 0:
            num += 1
            n /= factor
            while n % factor == 0:
                n /= factor
    return num

def getMaxValue(values):
    factors = [getNumOfFactors(n) for n in values]
    tuples = zip(factors,values)
    sorted_tuples = sorted([tuple for tuple in tuples],key=lambda x: x[0])
    max_tuples = [tuple for tuple in sorted_tuples if tuple[0] == sorted_tuples[-1][0]]
    sorted_max_tuples = sorted([tuple for tuple in max_tuples],key=lambda x: x[1])
    return sorted_max_tuples[-1]

maxValue = getMaxValue([123,43,54,12,76,84,98,678,543,231])
print(maxValue)

Upvotes: 0

PARVATHY
PARVATHY

Reputation: 122

When you append the numbers that have the highest number of prime factors to the list n, you are storing them as strings and not integers. Hence when you do the max() function on n, which holds 84,678 and 231, 84 is returned. I would suggest you to convert the numbers using int(), when storing into n and then perform the max()function on it. Just tweak your code as under:

for t in index_of_same:
    n.append(int(a[t]))

Upvotes: 1

Related Questions