C# :: Aufgabe #362

2 Lösungen Lösungen öffentlich

Produkt der Werte eines Arrays

Fortgeschrittener - C# von JKooP - 21.02.2021 um 12:15 Uhr
Gegeben ist ein Array bestehend aus Integer-Werten. Aus diesen Werten soll das Produkt errechnet werden,
aber immer ausgenommen der Zahl, welche sich an der Stelle des Durchlaufs befindet.
Ist die letzte Stelle erreicht, geht’s von vorne weiter (Umlauf).

Beispiel:
Array = {1, 2, 3, 4}

Lösung:
Array = {24, 12, 8, 6}

Erklärung:
1. Durchlauf: 2 * 3 * 4 = 24 (ohne 1)
2. Durchlauf: 3* 4 * 1 = 12 (ohne 2)
3. Durchlauf: 4 * 1 * 2 = 8 (ohne 3)
4. Durchlauf: 1 * 2 * 3 = 6 (ohne 4)

Schreibe eine Funktion/Methode, mit der ein Array aus Integer-Werten aufgenommen werden kann und die Produkte als Integer-Array zurückgegen werden.

1. Aufgabe (leicht):
Verschachteln mehrerer Schleifen

2. Aufgabe (schwieriger):
das Ganze mit nur einem Schleifendurchlauf realisieren

Statt Arrays können, je nach Programmiersprache und Vorliebe, natürlich auch Listen oder Vektoren verwendet werden.

Viel Spaß

Lösungen:

vote_ok
von JKooP (16230 Punkte) - 10.04.2021 um 19:43 Uhr
NET 5.x; C# 9.x; VS-2019
Quellcode ausblenden C#-Code
var arrIn = new int[] { 1, 2, 3, 4 };

var l = arrIn.Length;
var arrOut = new int[l];

arrOut[0] = 1;
for (int i = 1; i < l; i++)
    arrOut[i] = arrOut[i - 1] * arrIn[i - 1];

var r = 1;
for (int k = l - 1; k >= 0; k--)
{
    arrOut[k] *= r;
    r *= arrIn[k];
}
System.Console.WriteLine($"[{string.Join(", ", arrOut)}]");
vote_ok
von JKooP (16230 Punkte) - 12.04.2021 um 19:57 Uhr
NET 5.x; C# 9.x; VS-2019

Hier die Lösung zu Aufgabe 2:
Ist aber längst nicht so performant wie Lösung 1 (ca. 10x langsamer),
wobei wir hier von Zeiten im Mikrosekundenbereich sprechen.
Quellcode ausblenden C#-Code
using System.Collections.Generic;
using System.Linq;

var lstIn = new List<int>() { 1, 2, 3, 4 };
var lstOut = new List<int>();

for (var l = 0; l < lstIn.Count; l++)
{
    var tmp = lstIn[0];
    lstIn.RemoveAt(0);
    lstOut.Add(lstIn.Aggregate(1, (x, y) => x * y));
    lstIn.Add(tmp);
}

System.Console.WriteLine($"[{string.Join(", ", lstOut)}]");