Für Anfänger bzw. Advanced Coders - Ein kleiner Buchtip ! {
-
hmm...:
int f(int x) { return x / abs(x); }
.oO(meisterleistung :D)
EDIT: ups *g*
int f(int x) { return x/(abs(x)+!x); }
muss es natürlich heißen
[ Dieser Beitrag wurde am 27.04.2003 um 03:16 Uhr von Mr. N editiert. ]
-
oder:
int f(int x) { return -1 + (x >= 0) + (x > 0); }
-
Original erstellt von DrGreenthumb:
**
/* Kann man denn eigentlich davon ausgehen, das int(true) auch wirklich 1 ergibt? /*JA
-
Ach man hat ein Größer bzw. Kleiner? Ich dachte solche Vergleiche sind wie genau wie if verboten. Naja, dann ist es ja langweilig.
-
Ein sinnloses Beispiel ohne praktischen Bezug wie soll das beim C++ lernen helfen?
-
Original erstellt von Lars:
Ein sinnloses Beispiel ohne praktischen Bezug wie soll das beim C++ lernen helfen?falsche Denkweise *g*
Meine Philosophie:
"Scheiss auf den Sinn, nichts hat einen."
-
Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.
-
Original erstellt von Bashar:
Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.Rult aber!
-
Original erstellt von HumeSikkins:
Ach man hat ein Größer bzw. Kleiner? Ich dachte solche Vergleiche sind wie genau wie if verboten. Naja, dann ist es ja langweilig.int func(int n) { return (n && 1) | ( n & INT_MIN) / (INT_MAX-1); }
enthält übrigens auch einen vergleich: (n && 1) ist ja if (n) if (1) return 1; ... und da wird n mit 0 verglichen. aber das nur am rande.
-
Original erstellt von Bashar:
Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.ojeh .. echt?
-
Original erstellt von Bashar:
Die meisten Dinge, die man zum Lernen programmiert, haben keinen praktischen Bezug.Gut aber das ist echt sinnlos! Demnächst wird in C++ Büchern erklärt wie man mit goto objektorientiert programmiert
-
Original erstellt von Lars:
Gut aber das ist echt sinnlos! Demnächst wird in C++ Büchern erklärt wie man mit goto objektorientiert programmiertNee. Man muss auch mal um die Ecke denken können. _Darum_ gehts doch eigentlich beim Programmieren.
-
@Mr.N.
Habe ich nicht ziemlich eindeutig geschrieben, dass ich in solchen Sachen keine Leuchte bin und das ich meine Lösung als nicht-gut betrachte? Was hilft es also, wenn du neun-mal-klug an meiner Lösung rumnörgelst? Und das auch noch mit einer Arroganz die fast schon weh tut.
In meiner Arroganz beantworte ich meine Frage gleich mal selbst: Es hilft absolut nichts.
Was helfen würde wäre das Posten einer schönen Lösung.
-
@HumeSikkins: Du hast es geschrieben. Meine größte Schwäche ist meine Arroganz :D. Ich habe übrigens nicht genörgelt sondern "nur" neunmal-klug korrigiert. Aber das ist hier noch mehr OT als das ganze sinnlos.
PS: Du willst eine schöne Lösung? Ohne Vergleich oder mathematische Funktion geht es bestimmt nicht:
int f(int x) { return x / (int) sqrt(x * x); }
[ Dieser Beitrag wurde am 27.04.2003 um 12:35 Uhr von Mr. N editiert. ]
-
Klingt doch intressant der Schinken!
Aber wer hat schon 25EUR fuer sowas
Kleiner Tipp:
Also ab zu EBay! habs grad fuer 9EUR inkl. Versand sofortkauf eingesackt.
-
Original erstellt von Mr. N:
**```cpp
int f(int x) {
return x / (int) sqrt(x * x);
}]**
Schlecht, weil 0.
Bibliotheksaufrufe sind übrigens plöt:int f(int n) { char b[sizeof 2 * CHAR_BIT + 2]; int a[] = { 1, 0, -1 }; sprintf(b, "%d", n); return a[(!strncmp(b, "-", 1)) * 2 + (!strncmp(b, "0", 1))]; }
Haha, das will man nicht.
Es ginge auch mit Fließkommazahlen:
int f(int n) { double res = sin(n / (double)INT_MAX) * 1.9; double a = ceil(res); double b = floor(res); return a+b; }
Lösungen ohne Bibliothek sollten auch gehen:
+ über Lookuptabellen (mit Arrays ist das platzraubend; man wird also mit Integerbits rumspielen)
+ ausrollen (und approximieren) von den Standardfunktionen (bei ceil/floor/sin sollte man das hinbekommen)Mehr fällt mir gerade nicht ein.
[ Dieser Beitrag wurde am 27.04.2003 um 13:44 Uhr von Daniel E. editiert. ]
-
Folgender Code funktioniert:
int f(int x) {
return (int) round(x / (abs(x) + 1.0));
}
-
round?
-
Original erstellt von <J_Red>:
**Folgender Code funktioniert:int f(int x) {
return (int) round(x / (abs(x) + 1.0));
}**int f(int x) { return x/(abs(x)+!x); }
auch.
ich behaupte (um es maschinennäher auszudrücken): eine lösung enhält _mindestens_ 1 vergleichende instruktion (die auch ausgewertet wird) oder funktioniert mit gleitkomma-funktionen. mal schaun wie sich ceil implementieren lässt:int ceil(int x) { return x + Z; }
wobei Z=größte zahl kleiner null. -2.1 wäre dann: int(-2.1 + 0.99)=-1 ... nicht wirklich. ich wage also zu behaupten, dass die aufgabenstellung ohne (impliziten) vergleichsoperator nicht zu lösen ist.
-
klar geht das.