C :: Aufgabe #179

1 Lösung Lösung öffentlich

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

Lösungen:

vote_ok
von Alpha1972 (60 Punkte) - 08.03.2018 um 16:21 Uhr
Quellcode ausblenden C-Code
#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
}
2656018

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.