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 Question d'origine: https://rosettacode.org/wiki/Anti-primes Ma tentative de solution: Réponse obligatoire: count dans main () . 1 2 4 6 12 24 36 48 60 120 180 240 360 720 840 1260 1680 2520 5040 7560
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
#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 Réponses :
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()
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
À 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)
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
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.
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à.
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
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()
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.