Si j'ai un nombre impair, comment puis-je la diviser en deux et laisser deux entiers, le premier étant un plus de plus que la seconde. Par exemple, 9 produiraient 5 et 4? P>
5 Réponses :
La "moitié plus petite" de Notez que "plus petit" et "plus grand" se réfèrent à la valeur absolue, donc dans le cas de négatif Bien sûr, si int x code> est x / 2 code>. La "moitié plus grande" est x / 2 + x% 2 code> ou x - x / 2 code>. P>
x code>, plus grand x code> est toujours impair et positif, alors x% 2 code> sera 1 code> et la moitié plus grande peut également être calculée. comme x / 2 + 1 code>. p>
x - x / 2 code> serait un peu plus simple pour la deuxième partie, étant donné que vous venez de calculer x / 2 code> ;-)
@DavidHeffernan: Bon point, l'a ajouté. Je crois que la division entière du X86 produit toujours le module dans un registre également, un compilateur intelligent peut-il optimiser le x% 2 code> dans un accès à un registre.
Il est peu probable que la performance soit celle pertinente et que vous devez toujours effectuer une addition, tout comme sur ma version.
@Larsmans - Integer Division de 2 est un morceau de gâteau pour tout compilateur décent: il s'agit simplement d'un changement de vitesse. Pas besoin d'un entier div code>.
@Mouviciel: "C'est juste un changement de quart" - en supposant un type non signé. Il y a un peu plus à cela pour les types signés en raison de la ronde à zéro. Dans cet exemple, nous savons peut-être que la valeur sera toujours positive et cela n'a pas d'importance, mais si le compilateur ne le sait pas, il ne peut pas faire cette transformation même si elle le souhaite.
@mouviciel pour les entiers négatifs, x / 2 code> et x >> 1 code> sont différents
@Steve Jessop - Je suis d'accord. Rien n'indique que l'entrée doit être non signée.
Qu'en est-il de cela?
Mais si cela est même, le résultat n'est pas ce qui est recherché.
@Richard numéro est étrange selon la question.
La spécification indique que A est impair.
@DavidHeffernan La question indique si j'ai un nombre impair code>. Ainsi, les résultats doivent être x / 2 code> si c'est un nombre pair.
@ RICHARDJ.ROSSIII La question indique que l'entrée est impair. Lisez-le à nouveau.
La question que je lis dit " si b> J'ai un nombre impair ..." qui sonne comme une possibilité que le nombre pourrait être même. En outre, pourquoi la peine d'utiliser une solution qui fonctionne seulement i> pour des nombres impairs, lorsqu'une solution qui fonctionne également pour les numéros même est aussi simple?
@Brian - j'ai lu: si j'ai i> comme: Compte tenu de l'hypothèse que i>. Il n'y a pas de spécification sur ce qu'il faut faire si l'entrée ne répond pas à la spécification. C'est peut-être une erreur critique qui nécessite une réinitialisation matérielle du tableau. C'est définitivement quelque chose à discuter avec le client et non quelque chose qui peut être supposé par un développeur.
J'ai lu la si j'ai i> comme une spécification aussi, mais cela ne fonctionnera pas pour un nombre impair négatif.
@mouvicel, bon point, mais si l'échec des chiffres même faisait partie de la spécification, il doit être codé comme une étape de validation distincte. J'aime votre réponse tel qu'il est maintenant, car il est correct pour toutes les contributions, que la spécification estime actuellement que l'entrée soit valide.
Ce serait ma façon recommandée: Je trouve qu'il est plus concis que la version EDIT: P> Les gens semblaient se plaindre de moi en utilisant un point flottant pour Les entiers, bien voici une version entièrement basée sur les bits: p> La seule mise en garde avec n ° 2 est que si l'entrée est négative, les résultats ne seront pas ce qui est attendu. < / p> p> x / 2 + x% 2 code>.
Cette version profite également du fait que la sortie sera correcte si vous l'exécutez à l'aide d'un nombre uniforme. P>
-1 Vous utilisez étage code> et plafond code> avec entrée de point flottant. Vos entrées sont des entiers.
@DavidHeffernan Bon point, corrigé, supprimez maintenant votre vote en bas!
Pas si c'est le mieux que vous demandiez que vous puissiez faire. Et non si vous insistez sur l'utilisation d'un point flottant pour un problème qui doit être effectué uniquement avec des arithmétiques entier.
L'arithmétique entier ne doit pas utiliser les opérations double code>. Et si le code doit être exécuté sur un microcontrôleur incorporé sans FPU et aucun math.h code>?
@DavidHeffernan Point flottant Math n'est pas si lent de nos jours et non de mentionner le fait que l'opérateur modulo peut prendre assez de temps à effectuer.
@ RICHARDJ.ROSSIII Je m'en fiche de la performance, il est simplement inutile d'utiliser FP Math pour l'arithmétique entier le plus trivial imaginable. Si je n'autoriserais jamais ce code passé compte de code.
@DavidHeffernan d'accord, j'ai mis à jour ma réponse avec une version totalement bitwise de l'opération.
Un peu la twiddling est encore pire! Utilisez simplement des opérateurs arithmétiques appropriés pour l'amour de Dieu! C'est le problème de programmation le plus trivial imaginable.
@DavidHeffernan mais j'aime le bit Twiddling, c'est amusant! (et généralement plus rapide par rapport aux opérateurs standard).
Non, ce n'est pas plus rapide. Pas à moins que votre compilateur soit des ordures.
pour les personnes qui utilisent des microcontrôleurs, où Ceci montre une alternative méthode, à l'aide de Shift sortie: p> / code> et % code> sont effrayer-coût-coût em> opérations: -) >>> code> et et code> qui sont parfois moins chers: p> iplus=9 iminus=-9
(iplus >> 1)=4 ((iplus >> 1) + (iplus & 1))=5
(iminus >> 1)=-5 ((iminus >> 1) + (iminus & 1))=-4
Je pensais que la réponse acceptée était dans le ballon de ballon mais pas clair. Si vous voulez un code de copie et coller, ce serait la meilleure solution dans mes yeux
Vous voulez dire
a / 2 code> etA / 2 + 1 code>?Voulez-vous que les expressions produisent la réponse correcte si 1. Le nombre est même (ou ne sera-t-il jamais nécessaire?), et 2. Si le nombre est négatif?