C :: Aufgabe #70 :: Lösung #2
4 Lösungen
#70
Giuga-Zahlen berechnen
Anfänger - C
von Gustl
- 13.02.2015 um 12:42 Uhr
Eine natürliche Zahl n ist eine Giuga-Zahl, wenn alle ihre Primteiler p den Wert n/p - 1 teilen.
Schreibe ein Programm welches alle Giuga-Zahlen bis zu einer festen Obergrenze ausgibt.
Erläuterung zu einer Giuga-Zahl findest du hier: Wikipedia
Schreibe ein Programm welches alle Giuga-Zahlen bis zu einer festen Obergrenze ausgibt.
Erläuterung zu einer Giuga-Zahl findest du hier: Wikipedia
#2
von Jordan (210 Punkte)
- 10.03.2015 um 09:05 Uhr
// Giuga Zahlen.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdlib.h"
#include "math.h"
struct element
{
int key;
int zahl;
struct element *next;
};
void append(struct element **liste, int value)
{
struct element *neuesElement;
struct element *liste_iter = *liste;
neuesElement = (struct element*)malloc(sizeof(struct element));
neuesElement->zahl = value,
neuesElement->next = NULL;
if(liste_iter != NULL)
{
while(liste_iter->next != NULL)
{
liste_iter = liste_iter->next;
}
liste_iter->next = neuesElement;
neuesElement->key = liste_iter->key+1;
}
else
{
*liste = neuesElement;
neuesElement->key = 0;
}
}
void printliste(struct element *list)
{
printf("das %d element hat den wert %d\n",list->key, list->zahl);
while (list->next != NULL)
{
list = list->next;
printf("das %d element hat den wert %d\n",list->key, list->zahl);
}
printf("\n\n");
}
element *Prim(int grenze)
{
struct element *primListe;
primListe = NULL;
int teiler = 0;
int j;
for(int i = 2; i <= grenze; i++)
{
for(j = (i-1); i%j; j--)
{
}
if(j == 1)
{
append(&primListe,i);
teiler = i;
}
}
return primListe;
}
int ifPrim(int zahl, struct element *primKey)
{
while(zahl != primKey->zahl && primKey->next != NULL)
{
primKey = primKey->next;
if(primKey->zahl == zahl)
{
//printf("Zahl ist eine Primzahl");
return 1;
break;
}
if(primKey->zahl > zahl)
{
//printf("Zahl ist keine Primzahl");
return 0;
break;
}
}
}
element *primTeiler(int zahl, int primzahlen)
{
struct element *primKey = Prim(primzahlen);
struct element *primKey_start = primKey;
struct element *primTeiler;
primTeiler = NULL;
int zahl_start = zahl;
if(!ifPrim(zahl, primKey))
{
while( zahl > 1 )
{
while(zahl % primKey->zahl == 0)
{
//printf("%d * ",primKey->zahl);
append(&primTeiler, primKey->zahl);
zahl = zahl / primKey->zahl;
}
primKey = primKey->next;
if(ifPrim(zahl, primKey_start))
{
//printf("%d = %d\n\n",zahl,zahl_start);
append(&primTeiler, zahl);
break;
}
if(zahl % primKey->zahl != 0)
{
primKey = primKey->next;
}
}
}
else
{
primTeiler = NULL;
}
return primTeiler;
}
void Giuga(int zahl)
{
struct element *PT = primTeiler(zahl, 10000);
if(PT != NULL)
{
while(PT->next != NULL)
{
//printf("%d\n",PT->zahl);
if( ((zahl / PT->zahl) -1) % PT->zahl == 0 )
{
//printf("%d ist ein Teiler von %d / %d -1\n", PT->zahl, zahl, PT->zahl);
PT = PT->next;
}
else
{
//printf("\nDie Zahl %d ist keine Giuga Zahl\n",zahl);
break;
}
if(PT->next == NULL)
{
if( ((zahl / PT->zahl) -1) % PT->zahl == 0 )
{
//printf("%d ist ein Teiler von %d / %d -1\n", PT->zahl, zahl, PT->zahl);
//printf("\nDie Zahl %d ist eine Giuga Zahl\n",zahl);
printf("%d\tGiuga\n",zahl);
}
}
}
}
else
{
printf("%d\tPrimzahl\n",zahl);
}
}
int main()
{
for(int i = 0; i<1000; i++)
{
int zahl = i;
Giuga(zahl);
}
getchar();
return 0;
}
Kommentare:
Für diese Lösung gibt es noch keinen Kommentar
Seite 1 von 0
1
