C :: Aufgabe #179 :: Lösung #1
1 Lösung
#179
Ermittlung von Zeilen- und Spaltennummer eines 2D-Array-Feldes
Anfänger - C
von hollst
- 09.02.2018 um 11:03 Uhr
Die Felder eines "unendlich" großen 2D-Arrays seien nach folgendem "Diagonal-Schema" nummeriert:
1 2 4 7 . . .
3 5 8 . . . .
6 9 . . . . .
10 . . . . . .
. . . . . . usw.
Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN) und die Spaltennummer (SN) zurückgibt.
Zeilen- und Spaltennummerierungen beginnen wie üblich mit 0.
Beispiele:
N = 8 -> ZN = 1, SN = 2
N = 31 -> ZN = 2, SN = 5
1 2 4 7 . . .
3 5 8 . . . .
6 9 . . . . .
10 . . . . . .
. . . . . . usw.
Man schreibe ein Programm, das für eine gegebene Feldnummer N die Zeilen- (ZN) und die Spaltennummer (SN) zurückgibt.
Zeilen- und Spaltennummerierungen beginnen wie üblich mit 0.
Beispiele:
N = 8 -> ZN = 1, SN = 2
N = 31 -> ZN = 2, SN = 5
#1
von Alpha1972 (60 Punkte)
- 08.03.2018 um 16:21 Uhr
#include <stdio.h>
/******************************************************************
Betrachtungen zur Lösung:
Mathematisch betrachtet sind alle Feldnummern der ersten Spalte
Dreieckszahlen. Sie lassen sich mit der Gaußschen Summenformel berechnen:
S(n) = 1+2+..+(n-2)+(n-1)+n
oder rekursiv S(n) = n + S(n-1)
Der Algorithmus nimmt eine beliebige Eingabezahl, und sucht als erstes
die nächst höhere Dreieckszahl
Bsp. N = 8
0 1 2 3
0 1 2 4 7
1 3 5(8)
2 6 9
3(10)
die nächst höhere Dreieckszahl ist in diesem Fall 10 und steht in ZN=3 SN=0
um die Spaltennummer zu ermitteln bildet er die Differenz zwischen
dieser Dreieckszahl und N (10-8 = 2)
Zuletzt berechnet er die Zeilennummer aus der Differenz
der Zeilennummer der Dreieckszahl (n) und der Spaltennummer. (y = (n) - x)
3 - 2 = 1
*/
#include <stdio.h>
int gsum (int n); /* Funktion löst die Gaussche Summenformel für die Zahl n */
void get_ij (int zahl, int *x, int *y); /*Funktion ermittelt Zeile und Spalte der Feldnummer*/
int
main ()
{
int N;
int i, j;
i = j = 0;
do
{
printf ("Geben sie eine ganze Zahl ein : ");
scanf ("%d", &N);
get_ij (N, &i, &j);
printf ("\nN = %d -> ZN = %d SN = %d \n", N, j, i);
}
while (N != 0);
return 0;
}
int gsum (int n) /* rekursive Gaussche Summenformel S(n) = n + s(n-1) */
{
if (n > 1)
return n + gsum (n - 1);
else
return n;
}
void get_ij (int Zahl, int *x, int *y)
{
int n = 0; /*Zeile Dreieckszahl (n) = 0 */
int z = 0; /* Dreieckszahl = 0 */
do
{
n++;
z = gsum (n);
//n++;
}while (z < Zahl); /* Berechne nächst höhere Dreieckszahl */
*x = (z - Zahl); /* berechne Spalte */
*y = ((n-1) - (*x)); // berechne Zeile
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
