1
votes

Sans module ou si fonction paire / impaire, comment vérifierait-on un nombre pair ou impair?

J'ai récemment passé un examen d'informatique à l'université dans lequel on ne nous a jamais enseigné à l'avance la fonction module ou tout autre contrôle de la fonction pair / impair et nous n'avons pas accès à la documentation externe à l'exception de nos notes de cours précédentes. Est-il possible de faire cela sans cela et comment?


2 commentaires

Mon approche naïve serait: diviser par 2 et vérifier si le résultat a des chiffres après la virgule non égaux à 0 => impair, si le résultat a des chiffres après la virgule égal à 0 => pair.


L'utilisation de ces fonctions n'était-elle pas une exigence absolue ou pensez-vous que vous ne pouviez utiliser que le contenu des diapositives? À l'époque où j'étais étudiant, il n'était pas rare que les professeurs parlent de connaissances en dehors du programme explicite, en particulier pour une opération aussi basique que le module. Dans tous les cas, il y a plusieurs façons, comme cela a déjà été montré


3 Réponses :


0
votes

Je suppose que ce n'est que pour les nombres entier car le concept de pair / impair m'échappe pour les valeurs à virgule flottante.

Pour ces nombres entier , la vérification de le bit le moins significatif (LSB) proposé par Rotem est la méthode la plus simple, mais il y en a beaucoup strong> d'autres façons d'accomplir cela.

Par exemple, vous pouvez utiliser l'opération division d'entiers comme test. Il s'agit de l'une des opérations les plus élémentaires mises en œuvre dans pratiquement toutes les plates-formes. Le résultat d'une division entière est toujours un autre entier . Par exemple:

>> is_even(x)
ans =
     1
>> is_even(y)
ans =
     0

Ici, j'ai converti la valeur 13 en int64 pour m'assurer que MATLAB traite le nombre comme un entier au lieu du type de données double . Ici aussi, le résultat est en fait arrondi vers l'infini à la valeur intégrale suivante. Il s'agit d'une implémentation spécifique à MATLAB, une autre plate-forme peut arrondir mais cela n'a pas d'importance pour nous car le seul comportement que nous recherchons est l'arrondi, quelle que soit la manière dont il se déroule. L'arrondi nous permet de définir le comportement suivant:

  • Si un nombre est pair : le diviser par 2 produira un résultat exact, de sorte que si nous multiplions ce résultat par 2, nous obtenons le nombre d'origine.
  • Si un nombre est impair : le diviser par 2 donnera un résultat arrondi, de sorte que le multiplier par 2 donnera un nombre différent de l'entrée d'origine.

Maintenant que la logique est élaborée, le code est assez simple:

%% sample input
x = int64(42) ;
y = int64(43) ;

%% define the checking function
%   uses only multiplication and division operator, no high level function
is_even = @(x) int64(x) == (int64(x)/2)*2 ;

Et évidemment, cela donnera:

>> x = int64( 13 ) ;
>> x / 2
ans =
                    7


1 commentaires

J'aime votre réflexion, mais je ne savais pas comment convertir en nombre entier. Je donne à cette réponse un solide 8,5 / 10 -> 9/10 cause des entiers :)



0
votes

Un camarade de classe m'a appris comment résoudre ce problème de manière simpliste avec des mathématiques plutôt qu'avec des fonctions.

Utilisation de (-1) ^ n:

Si n est impair, le résultat est -1

Si n est pair, le résultat est 1

C'est une réflexion assez originale, mais ce serait le seul moyen de résoudre ce problème sans connaissance préalable des fonctions complexes, y compris le mod.


0 commentaires

0
votes

AND au niveau du bit (&)

Extrayez le dernier bit du nombre à l'aide de l'opérateur AND au niveau du bit. Si le dernier bit est 1, alors c'est impair, sinon c'est pair. C'est le moyen le plus simple et le plus efficace de le tester. Exemples dans certains langages:

C / C ++ / C #

def is_even(value):
    return (value & 1) == 0

Java p >

public static boolean is_even(int value) {
    return (value & 1) == 0;
}

Python

bool is_even(int value) {
    return (value & 1) == 0;
}


0 commentaires