Je prends 1 à n chiffres et je trouve le nombre de nombres qui sont divisibles par A ou B mais non divisibles par les deux.
Je veux réduire la complexité du temps de ce bloc par un changement logique.
4 Réponses :
Calculez le nombre de nombres divisibles par A, ajoutez-le au nombre de nombres divisibles par B, soustrayez-le avec deux fois le nombre de nombres divisibles par le LCM (multiple commun le plus bas) de A, b.
Complexité du temps: Parce que pour calculer le plus grand nombre commun que vous calculez GCD (plus grand Diviseur commun) qui peut être calculé dans Remarque: Si vous incluez O (journal (Min (A, B))) CODE> STROND> P>
O (journal (min (A, B)))) code> p>
bits / stdc ++. H code >, vous pouvez utiliser la fonction intégrée pour calculer GCD:
Ce n'est pas la version "C ++". C'est la version de mise en œuvre spécifique du compilateur interne, que les programmeurs compétitifs reçoivent lorsqu'ils incluent les en-têtes BITS / CODE>.
De C ++ 17 LCM CODE> est disponible à partir de
Il me semble que votre code ne fonctionne pas comme vous le décrivez: il compte pour chaque chiffre divisible par B code>. Vous devriez vérifier si je suis multiple d'A ou B
if (i % a == 0 && i % b != 0) {...
} else if (i % a != 0 && i % b == 0) {...
}
Avant de l'optimiser, assurez-vous qu'il fonctionne en premier.
En ce moment, vous vérifiez si un numéro est divisible par Une petite chose que vous pouvez faire pour accélérer les choses est de faire la vérification de la divisibilité juste une fois chacune et sauvegarder le résultat au lieu de à deux reprises. Ensuite, vous pouvez utiliser un seul XOR pour le résultat final. P> B code> ou par
A code> et
B code>. Pour le faire
A code> ou
B code> mais pas les deux, vous devez basculer
i% b == 0 code> à
i% b! = 0 code> dans la première condition: p>
for(int i = 1; i <= n; i++) {
int div_a = (i % a == 0);
int div_b = (i % b == 0);
if (a ^ b) {
count++;
}
}
Commençons par ceci:
switch(a) { case 0: switch(b) { case 0: ... break; case -1: case 1: ... break; default: ... break; } break; case -1: case 1: switch(b) { case 0: ... break; case -1: case 1: ... break; default: ... break; } break; default: switch(b) { case 0: ... break; case -1: case 1: ... break; default: ... break; } break; }
Je pense que votre première condition devrait être
i% a! = 0 && i% b == 0 code>
Quelle est la variable 'k'?