Alle Teiler einer Ganzzahl berechnen

Voltex

Mitglied
Hallo,
ich stehe ein wenig vorm Berg. Ihc möchte einen Algorythmus schreiben, der mir alle Teiler einer Zahl berechnet und ausgibt und hinterher die beiden mittleren Teiler (Bsp.: Bei 12 wären das 3 und 4) in je einer Variable speichert, da diese beiden hinterher noch gebraucht werden. Wenn die Ganzzahl keine 2 "mittleren" Teiler hat (Bsp.: 25 wären nur 1,5 und 25) soll er mir den mittleren Teiler (5) in einer Variablen speichern.

Ich hab schon überlegungen angestellt, mit Modulo daran zu gehen und zuerst jede Zahl (Teiler) bei dem der Modulowert 0 ist, in einer Variablen zu speichern. Allerdings würde, wenn ich das in einer Schleife mache so wie ich es vorhatte, der Wert des teilers ja ständig überschrieben, sodass ich hinterher nicht an die beiden Mittelwerte komme.

Könnt ihr mir da Helfen?

Liebe Grüße,
Voltex
 
Und wie sieht es aus, wenn Du den ermittelten Teiler in ein Array schreibst, welches sich bei Erfolg um eine Stelle vergrößert ?

Pseudocode:
Code:
Zähler = 0
-Schleife Beginn-
  -Modulo Berechnung-
  If ( Modulo=0 -> Teiler gefunden ) {
     Zähler++
     Teilerliste[Zähler] = Teiler
  }
-Schleife Ende-
Zähler = Anzahl gefundener Einträge

**EDIT** Abhängig von der Größe der Zahlen, die Du durchsuchst, könnte man natürlich optimieren.
Für 2 nur die Einerstelle betrachten.
Für 3 die Quersumme
Sieb des Erastothenes für Primzahlen

mfg chmee
 
Ich hab leider noch nie mit arrays gearbeitet. Also wäre schön wenn du mir da einen kleinen Denkanstoß geben würdest ;)


EDIT: Habs mit dem Array jetzt hinbekommen. Jetz ist nurnoch die frage, wie ich an die beiden Mittleren Werte komme... also bei 12 erkennt der 6 Werte, 1, 2, 3, 4, 6 und 12... Und das Programm muss jetz eigenständig an die 3 und die 4 kommen...
 
Zuletzt bearbeitet:
Hallo,
dann geh einfach über die Anzahl an Arrayelementen. Bei gerader Anzahl kein Problem. Bei ungerader dann halt (int) casten und Rest abschneiden. Zusätzlich noch das Elemente array[(int)anzahl/2+1] ansprechen. Falls dein Array bei 0 beginnt natürlich beide Arrayzugriffe -1.

Also zusammenfassend, viel. so:
C:
double array[12];
...
int stelle=(int)( (sizeof(array)/sizeof(double)) )/2;
//tu was mit array

printf("%lf %lf\n",array[stelle-1],array[stelle]);

(Code aus dem Kopf, ohne Test)

Grüße ;)
 
Zuletzt bearbeitet:
Du hast doch die Größe des Array. Nimm die rechnerische Mitte.

Wenn das Array 6 Felder hat, dann sind 6/2 und 6/2+1 diejenigen Felder. Ist der Wert ungerade, dann ist es eben 7/2, dabei ergibt sich eine Kommazahl, wo Du die Nachkommazahlen wegschneidest bzw. rundest ( floor() oder abs() ).

mfg chmee

ups, zu spät :)
 
Hallo,

wenn du nur an den beiden "mittleren" Teilern interessiert bist, dann würde es auch reichen, die natürlichen Zahlen beginnend bei floor(sqrt(n)) absteigend auf die Teilereigenschaft zu testen. Wurde so ein Teiler d gefunden, so ist sein "Partner" einfach n/d. In Quellcode:
C++:
unsigned int n = 25;
unsigned int d = sqrt((double)n);

while (n % d != 0) d--;

std::cout << d << " * " << (n / d) << " = " << n << std::endl;

Grüße, Matthias
 
Vielen Dank für die freundliche Unterstützung. Der Algorythmus läuft jetzt fehlerfrei. Zumindest hab ich bisher keinen gefunden. Also, danke für die Unterstützung :)
 
Zurück