1
votes

Conversion de C ++ pour une boucle python

J'ai essayé de rechercher une question similaire, mais je n'ai pas pu la résoudre. Je ne sais pas comment convertir correctement certaines des fonctionnalités des boucles C ++. Surtout la condition count dans main () .

Question d'origine: https://rosettacode.org/wiki/Anti-primes

1 2 4 6 12 24 36 48 60 120 180 240 360 720 840 1260 1680 2520 5040 7560 

Ma tentative de solution:

def countDivisors(n):
    if (n < 2):
        return 1
    count = 2

    for i in range(2, int(n/2)-1, 1):
        print(i)    
        if(n%i == 0):
            count = count + 1
    return count

def main():
    print("The first 20 anti-primes are: ")
    n = 1
    while count < 20:    
        d = countDivisors(n)
        if(d > maxDiv):
            print(n)
            maxDiv = d
            count += 1
            n += 1
    return 0

Réponse obligatoire:

#include <iostream>

int countDivisors(int n) {
    if (n < 2) return 1;
    int count = 2; // 1 and n
    for (int i = 2; i <= n/2; ++i) {
        if (n%i == 0) ++count;
    }
    return count;
}

int main() {
    int maxDiv = 0, count = 0;
    std::cout << "The first 20 anti-primes are:" << std::endl;
    for (int n = 1; count < 20; ++n) {
        int d = countDivisors(n);
        if (d > maxDiv) {
            std::cout << n << " ";
            maxDiv = d;
            count++;
        }
    }
    std::cout << std::endl;
    return 0;
}
p>


4 commentaires

Vous référencez maxDiv trop tôt. Quelle est la valeur initiale de maxDiv?


0. En fait, j'ai initialisé maxDiv et compte à 0, mais je l'ai supprimé avant de poster ici.


J'ai apporté quelques modifications à la question d'origine


Faites de votre mieux pour éviter de penser en C ++ lors de l'écriture de code Python. La logique peut être logique, mais la meilleure façon d'implémenter la logique dans les deux langages est très, très différente.


4 Réponses :


0
votes

Vous pouvez essayer ceci. Cela donne-t-il le résultat que vous recherchez?

def countDivisors(n):
    if (n < 2):
        return 1
    count = 2

    for i in range(2, int(n/2)-1, 1):
        print(i)    
        if(n%i == 0):
            count = count + 1
    return count

def main():
        print("The first 20 anti-primes are: ")
        n,maxDiv = 1,0
        for d in range(1,20):    
            d = countDivisors(n)
            print(d)
            if(d > maxDiv):
                maxDiv = d
            n+=1
        return 0
if __name__ == "__main__":
    main()


2 commentaires

essayé, n'a pas fonctionné hors de la boîte. Je regarderai de plus près plus tard pour voir si de petits changements pourraient éventuellement le corriger.


l'a ajouté en question, avec la question originale



1
votes

À proprement parler des deux boucles for :

maxDiv = 0  # <-- !
count = 0   # <-- !
n = 1
while count < 20:    
    d = countDivisors(n)
    if(d > maxDiv):
        print(n)
        maxDiv = d
        count += 1
    n += 1

deviendrait

int maxDiv = 0, count = 0;    // <-- !
for (int n = 1; count < 20; ++n) {
    int d = countDivisors(n);
    if (d > maxDiv) {
        std::cout << n << " ";
        maxDiv = d;
        count++;
    }

Le int (n / 2) -1 dans votre code serait i en C.


Le 20,

for i in range(2,int(n/2)+1):

est presque là, mais vous n'avez pas maxDiv et count initialisés dans celui de Python.

for (int i = 2; i <= n/2; ++i)


3 commentaires

Votre traduction de la deuxième boucle est erronée. L'original en C ++ fera une boucle plus de 20 fois, et se cassera lorsque count , et non i , aura atteint 20.


@MartinBonnersupportsMonica vrai, je me concentrais sur l'autre boucle.


@StormClaw: Je ne veux pas le modifier à nouveau, mais la partie n + = 1 était une "correction automatique" sans commentaire: donc dans la question c'était "trop ​​en retrait" et donc une partie du < code> if , pas le while . Ensuite, cela fonctionne, voir ideone.com/48bWNu



0
votes

Fondamentalement, la boucle C for et la boucle Python for sont différentes. Vous avez deux choix.

Le premier choix est de faire ce que vous avez fait et d'utiliser une boucle Python while pour répliquer la partie test-and-stop de la boucle C for . Si vous faites cela, vous devez écrire l'itération vous-même.

Le deuxième choix est d'utiliser une boucle Python for pour répliquer l'itération, et d'écrire le test et -arrêter une partie du code.

import itertools
.
.
.
        for n in itertools.count(1):    
            d = countDivisors(n)

            if(d > maxDiv):
                print(n)
                maxDiv = d
                count += 1
                if count >= 20:
                    break

Je pense que je préfère cette forme, mais c'est vraiment une question de goût.


1 commentaires

J'essaie d'éviter d'utiliser les bibliothèques de préférence, d'où la raison pour laquelle j'utilise la méthode while. Il se fait tard ici, alors je vais essayer une autre fois demain. Mabye quelqu'un trouvera une solution d'ici là.



0
votes

J'utilise une fonction de carte dans countDivisors.

The first 20 anti-primes are:
1 2 4 6 12 24 36 48 60 120 180 240 360 720 840 1260 1680 2520 5040 7560 

Essayez en ligne p>

sortie: p>

def countDivisors(n):
    if n < 2:
        return 1
    return 2 + sum(map(lambda x: 0 if n % x else 1, range(2, int(n / 2) + 1)))


def main():
    max_div = 0
    count = 0
    print("The first 20 anti-primes are:")
    x = 1
    while count < 20:
        d = countDivisors(x)
        if d > max_div:
            print(x, end=' ')
            max_div = d
            count += 1
        x += 1
    return 0


if __name__ == '__main__':
    main()


0 commentaires