Aus Spaß, würde ich gerne sehen, wie jemand LINQ benutzt und missbraucht, um dieses Geldproblem zu lösen. Ich habe wirklich keine Ahnung, wie Sie es tun würden - ich nehme an, einige Sätze zu füllen und dann davon zu wählen.Kann jemand LINQ missbrauchen und dieses Geldrätsel lösen?
Wenn Sie eine Gesamtanzahl von Münzen erhalten und die Gesamtmenge aller Münzen addieren: Zeigen Sie jede mögliche Münzkombination an. Münzen sind Quarters (.25), Dimes (.10) Nickels (.05) und Pennies (.01)
Enthalten Sie die Option, so dass es eine Null von einer Art von Münze geben kann oder es mindestens 1 sein muss jeder.
Beispiel Problem: Wenn ich 19 Münzen habe und die Münzen summieren sich zu $ 1.56 und es muss mindestens 1 von jeder Art von Münze sein.
Die Antwort wäre:
1 Quarters, 9 Dimes, 8 Nickels, 1 Pennies
2 Quarters, 5 Dimes, 11 Nickels, 1 Pennies
2 Quarters, 9 Dimes , 2 Nickels, 6 Pennies
3 Quarters, 1 Dimes, 14 Nickels, 1 Pennies
3 Quarters, 5 Dimes, 5 Nickels, 6 Pennies
4 Quarters, 1 Dimes, 8 Nickels, 6 Pennies
5 Quarters, 1 Dimes, 2 Nickels, 11 Pennies
Und wenn wir Null für eine coint erlaubt wir erlaubt erhalten eine zusätzliche 0 Viertel, 13 Dimes, 5 Nickels, 1 Pennies
Hier ist ein Beispiel C# -Code mit einer Brute-Force-Methode, um das Problem zu lösen. Mach dir keine Mühe, die Probe zu verbessern, lass uns nur eine Lösung mit Linq sehen. // Versuchen Sie, möglichst keinen regulären C# Looping-Code zu verwenden.
private void SolveCoinProblem(int totalNumberOfCoins, double totalAmount, int minimumNumberOfEachCoin)
{
int foundCount = 0;
long numberOfTries = 0;
Console.WriteLine(String.Format("Solving Coin Problem:TotalNumberOfCoins={0}TotalAmount={1}MinimumNumberOfEachCoin{2}", totalNumberOfCoins, totalAmount, minimumNumberOfEachCoin));
for (int totalQuarters = minimumNumberOfEachCoin; totalQuarters < totalNumberOfCoins; totalQuarters++)
{
for (int totalDimes = minimumNumberOfEachCoin; totalDimes < totalNumberOfCoins; totalDimes++)
{
for (int totalNickels = minimumNumberOfEachCoin; totalNickels < totalNumberOfCoins; totalNickels++)
{
for (int totalPennies = minimumNumberOfEachCoin; totalPennies < totalNumberOfCoins; totalPennies++)
{
numberOfTries++;
if (totalQuarters + totalDimes + totalNickels + totalPennies == totalNumberOfCoins)
{
if (Math.Round((totalQuarters * .25) + (totalDimes * .10) + (totalNickels * .05) + (totalPennies * .01),2) == totalAmount)
{
Console.WriteLine(String.Format("{0} Quarters, {1} Dimes, {2} Nickels, {3} Pennies", totalQuarters, totalDimes, totalNickels, totalPennies));
foundCount++;
}
}
}
}
}
}
Console.WriteLine(String.Format("{0} Combinations Found. We tried {1} combinations.", foundCount, numberOfTries));
}
Mit LINQ, um dies zu lösen wäre kaum Missbrauch! :-) –
BTW, der Grund, dass Ihr Code 5 (nicht 7) Antworten findet, ist wegen Rundungsfehler. Schalten Sie durchgehend auf Dezimal (0,05 M, etc) und Sie könnten überrascht sein! –
Re "Fließkomma BS" - das ist nicht BS; So funktioniert das Fließkomma. Die Faustregel: Wenn Sie "float" (oder "double") und "money" im selben Satz sehen, ist es wahrscheinlich falsch. –