C# :: Aufgabe #352
2 Lösungen
Gleichwertige Zahlenpaare zählen/auflisten
Anfänger - C#
von JKooP
- 09.01.2021 um 16:17 Uhr
Erstelle eine Methode/Funktion, mit der es möglich ist, aus einem beliebig großen Array/Liste
die Anzahl aller gleichwertigen Zahlenpaare auszugeben.
Wer möchte, kann natürlich die Zahlenpaare bzw. Indizes zusätzlich mit ausgeben.
Beispiele:
[1, 2, 3, 1, 1, 3] => 4 gleiche Zahlenpaare
mit den Indizes: (0, 3), (0, 4), (3, 4), (2, 5)
und den Lösungen: (1, 1), (1, 1), (1, 1), (3, 3)
[1, 1, 1, 1] => 6 gleiche Zahlenpaare
mit den Indizes: (0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)
und den Lösungen: (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)
[1, 2, 3, 4] => 0 gleiche Zahlenpaare
Hier gibt es verschiedene Herangehensweisen:
Lösung 1 (einfach): Verschachteln mehrerer Schleifen
Lösung 2 (schwieriger): nur eine Schleife
Vielleicht kann man es sogar mittels Fakultät und Binomialkoeffizient berechnen?!
Ich habe dafür ad hoc auch noch keine Lösung. Es gibt hier bestimmt die eine oder andere gute Idee.
Viel Spaß
die Anzahl aller gleichwertigen Zahlenpaare auszugeben.
Wer möchte, kann natürlich die Zahlenpaare bzw. Indizes zusätzlich mit ausgeben.
Beispiele:
[1, 2, 3, 1, 1, 3] => 4 gleiche Zahlenpaare
mit den Indizes: (0, 3), (0, 4), (3, 4), (2, 5)
und den Lösungen: (1, 1), (1, 1), (1, 1), (3, 3)
[1, 1, 1, 1] => 6 gleiche Zahlenpaare
mit den Indizes: (0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)
und den Lösungen: (1, 1), (1, 1), (1, 1), (1, 1), (1, 1), (1, 1)
[1, 2, 3, 4] => 0 gleiche Zahlenpaare
Hier gibt es verschiedene Herangehensweisen:
Lösung 1 (einfach): Verschachteln mehrerer Schleifen
Lösung 2 (schwieriger): nur eine Schleife
Vielleicht kann man es sogar mittels Fakultät und Binomialkoeffizient berechnen?!
Ich habe dafür ad hoc auch noch keine Lösung. Es gibt hier bestimmt die eine oder andere gute Idee.
Viel Spaß
Lösungen:
using System;
using System.Collections.Generic;
namespace TJP352_Zahlenpaare
{
class Program
{
static void Main(string[] args)
{
// Testliste befüllen
List<int> myList = new List<int>();
for(int i=1; i<=20; i++)
{
for (int j = 0; j < i; j++)
{
myList.Add(i);
}
}
FindeZahlenpaare(myList);
}
/// <summary>
/// Zahlenpaare finden
/// </summary>
private static void FindeZahlenpaare(List<int> myList)
{
var itemList = new List<int>();
var ergebnis = new List<KeyValuePair<int, int>>();
// Zahlenpaare ermitteln
foreach (var item in myList)
{
if (!itemList.Contains(item))
{
itemList.Add(item);
int anzahl = myList.FindAll(x => x.Equals(item)).Count;
ergebnis.Add(new KeyValuePair<int, int>(item, (int)(item * BerechneMultiplikator(anzahl))));
}
}
// Ausgabe
foreach (var item in ergebnis)
{
Console.WriteLine("Zahlepaare für {0}: {1}", item.Key, item.Value);
}
}
/// <summary>
/// Multiplikator berechnen
/// </summary>
private static float BerechneMultiplikator(int anzahl)
{
// Formel: 1 + (anzahl - 3) * 0.5
return 1 + (anzahl - 3) * 0.5f;
}
}
}
NET 5.x; C# 9.x; VS-2019
C#-Code
using System;
using System.Collections.Generic;
var a = new int[] { 1, 2, 3, 1, 1, 3 };
Console.WriteLine($"Identische Paare für [{string.Join(", ",a)}]: {IdenticalPairs(a)}");
static int IdenticalPairs(int[] n)
{
var d = new Dictionary<int, int>();
var c = 0;
foreach (var i in n)
{
if (!d.ContainsKey(i))
d.Add(i, 1);
else
c += d[i]++;
}
return c;
}
