0
votes

Comment puis-je réduire la complexité de temps du bloc de code suivant?

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. xxx


2 commentaires

Je pense que votre première condition devrait être i% a! = 0 && i% b == 0


Quelle est la variable 'k'?


4 Réponses :


5
votes

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: O (journal (Min (A, B)))

Parce que pour calculer le plus grand nombre commun que vous calculez GCD (plus grand Diviseur commun) qui peut être calculé dans O (journal (min (A, B))))

Remarque: Si vous incluez bits / stdc ++. H , vous pouvez utiliser la fonction intégrée pour calculer GCD: __ gcd (int, int) xxx


2 commentaires

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 / .


De C ++ 17 LCM est disponible à partir de : en.cpprefreence.com/w/cpp/numérique/lcm



0
votes

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) {...
}


0 commentaires

0
votes

Avant de l'optimiser, assurez-vous qu'il fonctionne en premier.

En ce moment, vous vérifiez si un numéro est divisible par 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> xxx pré>

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>

for(int i = 1; i <= n; i++) {
    int div_a = (i % a == 0);
    int div_b = (i % b == 0);

    if (a ^ b) {
        count++;
    }
}


0 commentaires

0
votes

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;
}


0 commentaires