2013-12-12 7 views
5

Was inc der kürzeste Weg ist oder Dezember der Absolutwert eines intaber die Zeichen halten (+-)?Inkrementieren Sie den absoluten Wert des int-Erhaltungszeichens?

int a = 5; 
int b = -7; 
// increment abs of both 
// a -> 6 
// b -> -8 
// incrementing 0 wasn't interesting me, I guess it can stay 0 

(Ich bin sicher, es ist nicht so schwer, aber ich werde wahrscheinlich mit einigen Zeilen Code am Ende. Aber ich frage mich, ob ich diese sehr kurz machen, 1-Liner?). Ich habe auch das C# -Tag entfernt, weil das für alle Arten von Sprachen interessant sein könnte.

+6

Was sollte für 0 passieren? – Servy

+0

@ mini-me - Sie haben zwei sehr gute Antworten - eine erhält Null, die andere erhöht sie. Können Sie disambiguieren? – Floris

Antwort

17

IF 0 sollte als 0 gelassen werden: da Math.Sign kehrt +1, -1 oder 0, können Sie tun:

a += Math.Sign(a); 
+2

Boom. sehr, sehr nette Antwort, Alter. – Almo

+3

Ich mag das, sauber und einfach. – CodeLikeBeaker

4

Wenn Sie 1 wollen die Antwort sein, wenn Sie es 0 füttern, hier ist ein Weg:

a = Math.Sign(a) * (Math.Abs(a) + 1) 
4

i vorstellen würde eine Inline-Vergleich ist billiger als ein ABS-Aufruf:

int res = a + (a >= 0 ? 1:-1) 

Dies setzt voraus, dass 0 eine positive Zahl ist.

+3

Oder wenn Sie nur die Variable 'a + = a> = 0 aktualisieren möchten? 1: -1; ' –

1

Da der C# Tag von der Frage entfernt wurde, würde Ich mag bieten diese (C) Antwort:

#define absInc(a) ((a<0)?(--a):(++a)) 

, wenn Sie dies in Ihrem Header platzieren, können Sie die folgenden in Ihrem Code tun (getestet, funktioniert):

int a = -4; 
absInc(a); 
printf("a is now %d\n", a); 

Ergebnis: -5

Ich habe dies neu gepostet, da meine ursprüngliche (ähnliche) Antwort eine Menge downvotes bekam, da diese Art von Konstrukt in C# nicht existiert. Ich hatte nicht auf das Etikett geachtet ...

Verwandte Themen