Ich muss die Summe von zwei Diagonalen in einer Matrix in C ++ berechnen, ich habe bereits eine Lösung dafür, aber ich muss dumm sein, weil ich nicht verstehen kann, was es tut, also würde ich gerne wissen, ob es eine andere Version gibt was ich verstehen kann. Hier ist der Code, der die Aufgabe erfüllt:
%Vor%Der Teil, der schwer zu verstehen ist, ist
%Vor%Hier ist der gesamte Code, den ich geändert habe, aber er funktioniert nicht für die sekundäre Diagonale:
%Vor%Es wäre schön, Kommentare auf Englisch zu haben, aber der Code tut es (zweite Schleife):
%Vor% Der viel schönere und viel effektivere Code (mit n
anstelle von n^2
) wäre:
Dies geht direkt durch die Diagonalen (beide an der einen Schleife!) und geht nicht durch andere Gegenstände.
BEARBEITEN:
Die Hauptdiagonale hat die Koordinaten {(1,1), (2,2), ..., (i,i)}
(daher i == j
).
Sekundäre Diagonale hat Koordinaten (in Matrix 3x3): {(1,3), (2,2),(3,1)}
was im Allgemeinen ist: {(1,n-1+1), (2, n-2+1), ... (i, n-i+1), .... (n,1)}
. Aber in C werden Arrays von 0 indiziert, nicht von 1, so dass Sie +1
(wahrscheinlich) nicht benötigen.
Alle Elemente in der sekundären Diagonale müssen in die Bedingung passen: i == n - j + 1
(wieder aufgrund der Indexierung von C von 0 +1
ändert sich in -1
( i=0,
, n=3
, j=2
, j = n - i - 1
)).
Sie können dies alles in einer Schleife (Code oben) erreichen.
Wie wäre es, wenn ich versuche, diese Version zu erklären? : D
Es gibt 3 wichtige Teile des Codes:
Und hier sind sie, erklärt:
%Vor%Hier enthalten d und s die Inter-Werte von Dur- bzw. Moll-Diagonale. Am Ende von 2 Schleifen enthalten sie die Ergebnisse
%Vor%Hoffe, das hilft.
Beachten Sie, dass dieser Code Matrixkoordinaten bei 1 anstelle von 0 startet. Daher müssen Sie (n+1)x(n+1)
Leerzeichen für die Matrix zuweisen:
vor der Verwendung.
Auch der von Ihnen angegebene Code ist nicht sehr effektiv. Es hat O(n^2)
Komplexität, während die Aufgabe in O(n)
wie folgt ausgeführt werden kann:
Sie müssen i + j == n + 1
anstelle von i + j == n - 1
für die sekundäre Diagonale verwenden, d. h.