So, wie man eine Funktion schafft, um am nächsten bis 9 9+ 1 am nächsten bis zu gegebenem int zurückzugehen, keinen Rest zu hinterlassen, wenn durch 2 int geteilt?Wie findet man die nächste gerade Zahl für gegebenes int? (gegeben 11 zurück 12)
Antwort
"Nearest" ist mehrdeutig, wenn eine Ganzzahl angegeben wird. Nimm zum Beispiel 9: Sowohl 8 als auch 10 sind gerade und sind gleich daneben. Wenn Sie wollen immer gehen, dann so etwas wie ...
int nearestEvenInt(int to)
{
return (to % 2 == 0) ? to : (to + 1);
}
number % 2 == 0?number:number+1
Ein anderer Weg ist (number>>1)<<1
aber ich bin nicht sicher Negative/little/big-endians.
'(Nummer >> 1) << 1' hat UB für negative Werte. ('>>' ist nur implementation-defined, aber '<<' ist undefined; es ist ein arithmetischer Überlauf) –
if (x %2 == 0) return x; else return x+1;
?
Abrunden sogar
x & ~1
Runde bis zu sogar
(x + 1) & ~1
Die Art, wie ich normalerweise lieber (number+1) & ~1
ist, aber Nicht jeder erkennt das Idiom, also müssen Sie vielleicht Ihr Audi betrachten enheit. Wenn es für negative Ganzzahlen arbeiten soll, dann erkennen Nicht-Zweierkomplement-Implementierungen von C und C++ das Idiom nicht (es wird ungerade negative Zahlen nach unten anstatt nach oben auf negative Vorzeichen- + Betragszahlen runden.) , und negative gerade Zahlen ungerade auf Einsen ergänzen, so dass es nicht vollständig portierbar ist, wenn negative Eingabe erlaubt ist.
Die tragbare Antwort ist (number % 2 == 0) ? number : number+1;
, und lassen Sie den Compiler über Optimierung sorgen.
Beachten Sie auch, dass Sie nicht definiert haben, was das Ergebnis für INT_MAX
sein soll, das ist ungerade, aber für die gibt es keinen größeren sogar int
Wert.
Eine weitere "portable" Möglichkeit ist 'number + (number% 2)', die in C99 positive auf positive und negative Unendlichkeit runden wird. – caf
Wenn Sie von 0 weggehen möchten, ist die Antwort von Caf am besten. Aber wenn du zusammenrunden willst, musst du "&" oder einige fiese Bedingungen verwenden. –
Da die meisten der hier Antworten sind entweder nonportable oder haben überschüssige conditionals, hier ist die schnelle und tragbare Antwort:
number += (int)((unsigned)number & 1)
Der Fall unsigned
stellt sicher, dass bitweise und definiert ist, wie erwartet, und die Besetzung zurück zu int
(was wohldefiniert ist, da beide möglichen Werte der bitweisen und Operation, Null oder Eins, passen in int
) verhindert, number
auf unsigned
heraufgestuft werden, was dann zu implementierungsdefiniertem Verhalten führen würde, wenn es zurück in int
konvertiert wird um das Ergebnis number
zuzuweisen.
weiß, dass ich die OP für int gefragt, aber hier ist eine Antwort für Schwimmer zu:
number = Math.round(number * 0.5f) * 2; //Closest (up for middle)
number = Math.ceil(number * 0.5f) * 2; //Always Up
number = Math.floor(number * 0.5f) * 2; //Always Down
ein wenig zu spät zur Party, aber das ist eine saubere Lösung
n += (n % 2);
- 1. Baum, Knoten mit Wert gerade größer als ein gegebenes n
- 2. Runden Daten auf die nächste gerade ganze Zahl
- 3. Finden Sie die nächste schöne Zahl
- 4. VB.Net Warum macht Math.Round 5 auf die nächste gerade Zahl, und was kann ich dagegen tun?
- 5. minBound und maxBound geben falsche Zahl für Int zurück
- 6. Wie beurteilt man eine int-Zahl ungerade oder gerade? (der binäre Weg)
- 7. Wie findet man die Indices von Items, die eine Bedingung in List of int erfüllen?
- 8. zurück nächste Seiten für WinForms
- 9. Auf die nächste ganze Zahl runden
- 10. Wie findet man das nächste Datum aus zwei Datenrahmen?
- 11. Wird eine "Ganzzahl" float zu int immer die nächste ganze Zahl zurückgeben?
- 12. Runde Nummer nächste ganze Zahl
- 13. Wie findet man die Schnittmenge?
- 14. Wie wird die Zahl vom Float in die nächste ganze Zahl php umgewandelt?
- 15. Addieren Sie das Inkrement und geben Sie die nächste Zahl zurück
- 16. Redshift psql auto Inkrement auf gerade Zahl
- 17. Wie kann ich feststellen, ist die Zahl gerade?
- 18. Wie man eine Zahl auf eine gewählte ganze Zahl rundet
- 19. Regulärer Ausdruck für nur ungerade oder gerade Zahl
- 20. mysql INT (11) Fehler
- 21. Wie man Call-Graphen für gegebenes Javascript erzeugt?
- 22. Wie findet man die häufigsten Werte in numpy ndarray?
- 23. Wie richte ich auf die nächste ganze Zahl
- 24. Kompilierbibliothek für armv7s - cputype (12) und cpusuxtype (11)
- 25. Wie bestimmen Sie, welche Zeitzone gerade um 12 Uhr ist?
- 26. Wie findet man die nächste Übereinstimmung basierend auf 2 Schlüsseln von einem Datenrahmen zum anderen?
- 27. Ein Double auf die nächste ganze Zahl aufrunden
- 28. Nächste Nachbarn in Python gegeben die Distanz-Matrix
- 29. Wie findet man diese Funktionskomplexität?
- 30. In PHP gegeben einen Monat String wie "November" wie kann ich 11 ohne eine 12-teilige switch-Anweisung zurückgeben?
Dieses Problem nicht ist eindeutig angegeben. 10 ist so nahe wie 11 als 12 ist. Welchen willst du?Und was ist mit negativen Zahlen? Und ist das Eingabe-Integral oder Gleitkomma? –
@David: Die Eingabe ist eindeutig ganzzahlig, aber +1 für den Rest Ihres Kommentars – Cameron
Ich kann nicht glauben, dass es alle nachgewählten Antworten auf eine Frage gibt, die keine Antwort hat! –