8 Stimmen

Gleichmäßige Teilung in c#

Wie kann ich in c# 100 gleichmäßig durch 7 teilen?

Das Ergebnis wäre also

  1. 16
  2. 14
  3. 14
  4. 14
  5. 14
  6. 14
  7. 14

Der nachstehende Code ist falsch, da alle 7 Werte auf 15 (insgesamt 105) gesetzt sind.

        double [] vals = new double[7];
        for (int i = 0; i < vals.Length; i++)
        {
            vals[i] = Math.Ceiling(100d / vals.Length);
        }

Gibt es eine einfache Möglichkeit, dies in c# zu tun?

Merci

1 Stimmen

Warum sollte die erste 16 sein? Warum nicht 15, 15, 14, 14, 14, 14, 14? Das wäre IMO gleichmäßiger.

0 Stimmen

Will er damit sagen, dass alle "Teile" gleich sein müssen?

0 Stimmen

Ich hoffe nicht, sonst wird es wirklich schwierig, wenn der Zähler ungerade ist :)

28voto

Jon Skeet Punkte 1325502

Um das von mir vorgeschlagene Ergebnis von 15, 15, 14, 14, 14, 14, 14 zu erhalten:

// This doesn't try to cope with negative numbers :)
public static IEnumerable<int> DivideEvenly(int numerator, int denominator)
{
    int rem;
    int div = Math.DivRem(numerator, denominator, out rem);

    for (int i=0; i < denominator; i++)
    {
        yield return i < rem ? div+1 : div;
    }
}

Test:

foreach (int i in DivideEvenly(100, 7))
{
    Console.WriteLine(i);
}

0 Stimmen

Jon Skeet kann auch eine zweideutige Frage beantworten und akzeptiert werden. Dies muss die "Jon Skeet Fakten" Frage gehen :-)

0 Stimmen

Ich mag meine Linq-Lösung lieber, sie ist viel spartanischer :)

7voto

Sam Saffron Punkte 124121

Hier ist es:

Func<int, int, IEnumerable<int>> f = (a, b) => 
 Enumerable.Range(0,a/b).Select((n) => a / b + ((a % b) <= n ? 0 : 1))

Viel Glück beim Erklären im Unterricht :)

5voto

Aamir Punkte 14354

Da dies eine Hausaufgabe zu sein scheint, hier ein Hinweis und nicht der vollständige Code.

Du machst Math.Ceiling und es wandelt 14,28 in 15 um.

1voto

RobS Punkte 3757

Der Algorithmus lautet wie folgt

  1. Dividiere 100 durch 7, setze das Ergebnis in X
  2. Ermitteln Sie die höchste gerade Zahl unter X und setzen Sie diese in Y ein.
  3. Multipliziere Y mit 7 und schreibe das Ergebnis in Z.
  4. Ziehen Sie Z von 100 ab.

Die Antwort ist dann 6 Lose von Y plus das Ergebnis von Schritt 4.

Dieser Algorithmus funktioniert möglicherweise nur für diesen speziellen Fall.

Ich bin sicher, Sie können das in C# schreiben

0voto

chillysapien Punkte 2196

Ich bin mir nicht sicher, ob das genau das ist, was Sie wollen, aber ich würde denken, dass Sie bei der Verwendung von Math.ceiling immer eine zu große Summe erhalten werden. Math.floor würde die Summe unterschätzen und Ihnen eine Differenz hinterlassen, die Sie nach Belieben zu einem Ihrer Teile hinzufügen können.

Mit dieser Methode könnte man zum Beispiel 7 Lose von 14 erhalten, was einen Rest von 2 ergibt. Diese 2 kann man dann entweder in eines der Stücke stecken, was die von Ihnen vorgeschlagene Antwort ergibt, oder man kann sie gleichmäßig aufteilen und erhält zwei Stücke von 15 (wie in einem der Kommentare vorgeschlagen)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X