-1
votes

Les numéros d'impression qui sont des pouvoirs de la 3. Puis-je mieux coder ce programme?

file = open('funny_file.txt', 'r')
list = []
for i in file:
    list.append(int(i[:-1]))
print(len([num for num in list for i in range(100) if num == 3**i]))
The result is good but can i make it in other easier way?

7 commentaires

Pouvez-vous s'il vous plaît fournir des échantillons d'entrée et de sortie? C'est assez peu clair maintenant.


entrée: 40 30 120 33 145 27 64 24 201 100 343 5 7 et le résultat devrait être 2


Le seul carré de 3 est 9, voulez-vous dire des pouvoirs? Dans ce cas, vous pouvez simplement appliquer à plusieurs reprises divmod (n, 3) au nombre tant que le reste est 0 et que la DIV est non nulle. Si vous trouvez un reste non-zéro, ce n'est pas un pouvoir, si vous atteignez une DIV de 1, alors c'est.


Cette question est probablement mieux adaptée à Examen de codes Exchange de pile .


Vous avez raison, devrait être alimentant mon erreur


Une solution plus efficace utilisera probablement math.log (num, 3) .


D'abord! La sortie que vous fournissez dans le commentaire ci-dessus doit être 1. La seule puissance de 3 dans cette entrée est 27 . De plus, pouvons-nous supposer que vous n'obtiendrez pas une puissance de 3 passages que 100 exponent?


3 Réponses :


0
votes

Je suppose que par "carré du 3", vous voulez dire des pouvoirs de trois.

Il y a des choses dans votre déclaration d'impression que je vous recommanderais de réviser. Généralement, lorsque vous souhaitez atteindre un résultat particulier, il est logique de créer une fonction distincte pour celui-ci qui encapsule cette fonctionnalité. Dans ce cas, cela pourrait être une fonction qui nous dit si la saisie est une puissance de trois. En utilisant le logarithme avec la base trois, vous devriez pouvoir proposer une implémentation de cette fonction.


0 commentaires

0
votes

Un moyen d'optimiser le code consiste à ignorer le calcul des numéros déjà explorés avant, comme ci-dessous:

file = open('funny_file.txt', 'r')
list = []
for i in file:
    list.append(int(i[:-1]))
powerof_3_nums = []
not_power_of_3 = []
for num in list:
    if num in powerof_3_nums:
        continue
    if num in not_power_of_3:
        continue
    for i in range(100):
        if num == 3**i:
            powerof_3_nums.append(num)
print(len(powerof_3_nums))


0 commentaires

0
votes

En supposant que le plus grand exposant est 100 (à partir de votre plage (100) ). Vous pourriez faire un calcul assez O (1) . Vous pouvez d'abord calculer 3 ^ 100 = 5153775207320113331036461129765621272702107522001 . Maintenant, ce nombre divisé par une puissance de 3 (plus petit que ce nombre) a un rappel de 0 . Donc, vous pouvez écrire: xxx

maintenant, à propos de votre code. Je ne comprends pas pourquoi faites-vous deux boucles , lorsque vous pouvez obtenir la même chose en utilisant une seule. xxx

Sorties: < / strong>

1

^ qui est 27


0 commentaires