| 

.NET C# Java Javascript Exception

1
Meine Frage ist, ob man folgende Ausgabe auch etwas kürzer hinbekommt (C#), als ich das hier gemacht habe.

Das Resultat soll diesem hier entsprechen: (Ausgabe ohne Kommata)
8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 36, 40, 50

for (int i = 7; i < 50; )
{
if (i < 10)
i++;
else if (i >= 10 && i <= 28)
i += 2;
else if (i == 30)
i += 6;
else if (i == 36)
i += 4;
else if (i == 40)
i += 10;
else return;

Console.WriteLine(i.ToString());
}


Ich bin gespannt, was dabei rauskommt : )
News:
18.09.2009
Mario Priebe 6,0k 3 9
Nur als Anmerkung. Eine Switch-Anweisung wäre glaub ich der die besser Lösung als else if's
Floyd 18.09.2009
Leider kann ich meines Wissens nach keine "Ranges" im Switch angeben, oder?!
Mario Priebe 18.09.2009
Soweit ich weiß ist dem leider so. Zumindest habe ich keinen Weg gefunden, wie man < 10 oder ähnliches einbauen kann, da die switches grundsätzlich eine Konstante erwarten :(
Dustin Klein 18.09.2009
Range geht nicht aber mehrere case untereinander (ohne break).
gfoidl 18.09.2009
Ja, so hatte ich das zu erst gedacht, mich dann aber dagegen entschieden
Mario Priebe 18.09.2009
9 Antworten
1
Ich bin mir fast sicher, dass Dir diese Lösung nicht vorschwebte:

foreach (var item in new int[] {8, 9, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 36, 40, 50})
{
Console.WriteLine(item);
}

}
Aber um eine bessere Lösung zu finden, muss man erst einmal wissen, wie die Anforderungen wirklich lauten, d.h. was ist der allgemeine Fall?
18.09.2009
pjacobi 1,1k 2 7
Das stimmt in der Tat. Find ich auch gut.
Mario Priebe 18.09.2009
2
Ob kürzer kann man sich streiten, aber auf jeden fall "anders":
int x = 7;
for (int i = 0; i < 16; i++) {
x = x
+ Math.Floor(x / 5)
- Math.Floor(x / 15)
- Math.Floor(x / 20)
- Math.Floor(x / 25)
+ 4 * Math.Floor(x / 30)
- 3 * Math.Floor(x / 35)
+ 6 * Math.Floor(x / 40);
Console.WriteLine(x);
}

Das sieht schon ein wenig nach einer Reihe aus, die sich mglws noch optimieren läßt.
18.09.2009
FalkP 3,3k 3 8
1
Sehr interessant, was auch gleich noch Gesprächsstoff mit einem Kollegen schaffte ...

Erklärung zu Math.Floor aus der MSDN: Gibt die größte Ganzzahl zurück, die kleiner oder gleich der angegebenen Zahl ist.

Find ich gut, gibts n Punkt : )
Mario Priebe 18.09.2009
btw, x muss ein decimal oder double sein
Mario Priebe 18.09.2009
2
for (int i = 8; i <= 50; i++)
{
bool write = i < 10
|| i < 30 && i % 2 == 0
|| i < 40 && i % 6 == 0
|| i % 10 == 0;
if (write) Console.WriteLine(i.ToString());
}
18.09.2009
Charon 151 1 2
Diese Lösung find ich sehr gut!
Mario Priebe 18.09.2009
1
Sinnvoll kürzer geht das kaum, da dir zweifelsfrei viel Übersichtlichkeit verloren geht.
Eine mögliche "Kurzversion":

for (int i = 7; i < 50;)
{
Console.Write(i += i < 10 ? 1 : i >= 10 && i <= 28 ? 2 : i == 30 ? 6 : i == 36 ? 4 : i == 40 ? 10 : 0);
}


In der Theorie ist diese "Lösung" sogar ein Wenig schneller als die "normalen IFs".
18.09.2009
Blauesocke 637 2 8
1
Du kannst den 'i >= 10 && '-Part sogar weglassen. Du befindest dich ja im else-Teil der Abfrage 'i<10' ergo ist i>=10.
Charon 18.09.2009
1
Gibt es einen guten Grund, die Zahlen zu berechnen statt sie wie, schon vorgeschlagen, in einer Tabelle abzulegen?
Ansonsten gibt es noch folgende LESBARE Möglichkeit.

Console.WriteLine(8);
Console.WriteLine(9);
for (int i = 10; i <= 30; i += 2) Console.WriteLine(i.ToString());
Console.WriteLine(36);
Console.WriteLine(40);
Console.WriteLine(50);
18.09.2009
stefan.bachert 395 4
1
Hallo Ihrs,

nicht schön, aber es funktioniert
int j = 5, k = 1;
for (double i = 7; i < 50; ) {
i += k;
if ((i % j) == 0)
k = ((int)i / j);
j = (j == 5) ? 9 : (k==4) ? 4 : 5;
Console.WriteLine((int)i);
}

Herzliche Grüße
Lars
18.09.2009
Lars Schmitt 371 1 4
1
und noch ein Vorschlag:

int res = 7;

for (double i=0; i<16 ; i++){
res += Math.Floor((i+17)/20+1)
+ Math.Floor(i/13)*(i*2-26+(i%2)*4);
Console.WriteLine(res);
}
20.09.2009
huckepick 887 2 8
0
Mal dumm gefragt, wieso nimmst nicht einfach eine Mathematische Folge? z.b.:

Diese hier... (Index 6 bis 20)

Damit hättest du die Ausgabe von 8 bis 30 totgeschlagen und müsstest eigentlich nur noch 36, 40, 50 mit

Dieser Folge... (Index 3 bis 6)

ausgeben.

Natürlich mit den Richtigen Startdaten ^^.
18.09.2009
The_Holy_One 393 1 6
0
So geht es auch

int res = 7;

while (res <50){
res += Math.Floor((res+30)/20)
+ Math.Floor(res/30)*(Math.Ceiling(res/3)-7-res%5*4);
Console.WriteLine(res);
}


Hat den Vorteil, das keine Zählvariable benötigt wird
21.09.2009
huckepick 887 2 8

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH