Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Zahleninfo

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
03.04.2003, 21:37 Uhr
~gfmfg
Gast


Hallo,
ich bräuchte ein Programm, das wenn ich (ganze) Zahlen eingebe mir die einzelnen Primfaktoren der Zahl ausgibt. (mit einer while Schleife)
Danke!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.04.2003, 16:08 Uhr
Chillmaster



Hiho. Hier das Programm:


C++:
// Schreibt alle Primzahlen bis zu einer bestimmten Zahl auf den Bildschirm.
#include <iostream.h>
#include <conio.h>

int main();
bool prim(unsigned short zahl);

int main()
{
  unsigned short endZahl;
  bool istPrimzahl;

  cout << "Zahl eingeben: ";
  cin >> endZahl;

// Alle Zahlen bis zu eingegebenen an die Funktion prim übergeben
  for (unsigned short i = 1;  i <= endZahl;  i++)
    if ( istPrimzahl = prim(i) )
      cout << i << "\t";

  getch();
  return 0;
}

bool prim(unsigned short zahl)
{
  unsigned short i = 2;

// Untersuchende Zahl durch jede Zahl teilen
// (bis zur untersuchenden Zahl / 2).
// Falls teilbar, false zurückgeben.
  while ( i <= int(zahl / 2) )
  {
    if ( (zahl % i) == 0)
      return false;
    i++;
  }
  return true;
}

--
With Great Power Comes Great Responsibility
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.04.2003, 19:35 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich würde sowas in der Art eindeutig vorziehen:

C++:
bool prim(unsigned zahl)
{
   if (zahl<2 || (zahl%2==0 && zahl!=2)) return false;
   for(unsigned i=3; i*i<=zahl; i+=2)
   {
     if (zahl%i == 0) return false;
   }
   return true;
}


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 05.04.2003 um 19:36 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.04.2003, 13:26 Uhr
~0xdeadbeef
Gast


Wie wärs damit?

C++:
#include <stdio.h>

int main(int argc, char *argv[]) {
    unsigned long zahl, faktor;
    printf("Zahl eingeben: ");
    scanf("%ul", &zahl);
    for(faktor = 2; zahl > 1; ++faktor) {
        while(zahl % faktor == 0) {
            printf("%d\n", faktor);
            zahl /= faktor;
        }
    }
}


Dürfte für diesen Zweck deutlich schneller gehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.04.2003, 13:42 Uhr
~0xdeadbeef
Gast


virtuals Idee kann hier aber trotzdem noch Anwendung finden, etwa so:

C++:
#include <stdio.h>

int main(int argc, char *argv[]) {
    unsigned long zahl, faktor;
    printf("Zahl eingeben: ");
    scanf("%ul", &zahl);
    while(zahl % 2 == 0) { printf("2\n"); zahl /= 2; }
    for(faktor = 3; zahl > 1; faktor += 2)
        while(zahl % faktor == 0) {
            printf("%ul\n", faktor);
            zahl /= faktor;
        }
    return 0;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.04.2003, 13:48 Uhr
~0xdeadbeef
Gast


Ich Schussel. die Formatstrings müssen natürlich %lu sein, nicht %ul.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.04.2003, 14:08 Uhr
~0xdeadbeef
Gast


Und jetzt der absolute Optimierungskiller in Bezug auf Geschwindigkeit:

C++:
#include <stdio.h>

const unsigned int prime[] = { /* Hier eine Liste von Primzahlen zwischen 2 und 65537 */ };

int main(int argc, char *argv[]) {
    unsigned long zahl;
    int pr_index;
    printf("Zahl eingeben: ");
    scanf("%lu", &zahl);
    for(pr_index = 0; zahl > 1; ++pr_index) {
        while(zahl % prime[pr_index] == 0) {
            printf("%u\n", prime[pr_index]);
            zahl /= prime[pr_index];
        }
    }
    return 0;
}


Eine Liste von Primzahlen findet sich zum Beispiel in den Sourcen des Programms "primes" aus den bsdgames (Ein Source-Paket liegt z.B. auf ftp://ftp.debian.org/debian/pool/main/b/bsdgames/bsdgames_2.14.orig.tar.gz), das Forum hat mir die Liste abgeschnitten, weil sie zu lang war. Das Programm kriegt zwar platzmäßig einen ziemlichen Overhead, geht aber dafür dann ab wie Schmidts Katze.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
23.04.2003, 17:13 Uhr
~0xdeadbeef
Gast


OK, hier kommt der Bugfix:

Tauscht den Test auf zahl>1 gegen faktor*faktor<=zahl aus. Hintergrund ist der: Wenn der Faktor bei Wurzel(zahl) (also des Restes) angekommen ist, ist der Rest schon nicht mehr durch alle Zahlen, die kleiner als Faktor sind, teilbar - die haben wir nämlich vorher schon rausgehauen. Wenn eine Zahl durch keine Zahl kleiner oder gleich ihrer Wurzel teilbar ist, ist sie nach Schulmathe eine Primzahl. Et voila, wir haben unseren großen Primfaktor. Den Test darauf, ob zahl > 1 ist, können wir uns dann sparen, weil in dem Moment, in dem zahl bei eins ankommt, faktor*faktor mit Sicherheit größer als Zahl ist. Hier kommt das fertige Programm:

C++:
#include <stdio.h>

void print_primefactors(unsigned long long zahl) {
  unsigned long long faktor;
  printf("%llu:\t", zahl);
  while(zahl % 2 == 0) {
    printf("2 ");
    zahl /= 2;
  }
  for(faktor = 3; faktor*faktor <= zahl; faktor += 2)
    while(zahl % faktor == 0) {
      printf("%llu ", faktor);
      fflush(stdout);
      zahl /= faktor;
    }
  if(zahl > 1) printf("%llu", zahl);
  printf("\n");
}

int main(int argc, char *argv[]) {
  unsigned long long zahl;
  int i;
  if(argc > 1) {
    for(i = 1; i < argc; ++i) {
      sscanf(argv[i], "%llu", &zahl);
      print_primefactors(zahl);
    }
  } else {
    printf("Zahl eingeben: ");
    scanf("%llu", &zahl);
    print_primefactors(zahl);
  }
  return 0;
}


Mann, bin ich gut! ...und ich habe zuviel Freizeit...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
23.04.2003, 21:01 Uhr
Christian
C/C++ Master
(Operator)


DeadBeef, du bist Student, oder? (in keiner anderen Lebenssituation hat man so viel Freizeit, oder nicht?...)
--
Grüße, Christian
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
23.04.2003, 21:23 Uhr
Bruder Leif
dances with systems
(Operator)


Hey, nix gegen Studenten, ja? Ich hab jedenfalls nicht so viel Zeit
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: