Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Primzahlausgabe

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 ] [ 3 ]
000
21.07.2006, 09:18 Uhr
Rumak18



Und nochmal ich.....
Wo ist bei mir der Fehler im unteren Quellcode,da ich als Ausgabe alle Zahlen als "Dies ist keine Primzahl" bekomme.


C++:
//Primzahlenausgabe

#include <stdio.h>
#include<iostream>
using namespace std;

int i;
int zahl;
int ergebnis;

int main()
{
    for (zahl=1; zahl<=200 ; zahl++)        //Äußere Schleife : Inkremetierung von "Zahl"(Der Dividend der Modulo Division)
    {
        for (i=1; i<=zahl; i++)                //Innere Schleife : Inkremetierung von "i"(Der Divisor der Modula Division)
        {
        ergebnis = zahl % i;
            if (ergebnis = 0)
            {
                printf("Das ist eine Primzahl:%d\n",zahl);
            }
            else
            {
                printf("Das ist keine Primzahl:%d\n",i);
            }
        }
    }

}



mod edit: BENUTZE DIE CPP TAGS SELBER
--
WinXP Pro
Athlon 3200 64
Geforce 6600 GT
HDD320 GB
Visual Basic 6.0

Dieser Post wurde am 21.07.2006 um 12:31 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.07.2006, 09:32 Uhr
Tommix



Hallo,

Zitat von Rumak18:

C++:
            if (ergebnis = 0)



Das ist kein Vergleich, sondern eine Zuweisung. Du meinst

C++:
            if (ergebnis == 0)



Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.07.2006, 09:49 Uhr
virtual
Sexiest Bit alive
(Operator)


Anm: diese Funktion ist nicht das was du tun willst. In der inneren Schleife darf
1. keine ausgabe gemacht werden, sondern lediglich in der äußeren.
2. Die Innere schleife darf nicht bei 1 beginnen (sondern bei 2) und darf nicht bis einschließlkich zahl gehen.


C++:
for(int zahl=1; zahl<200; ++zahl) {
bool isPrime = true;
for(int i=2; i<zahl && isPrime; ++i) {
    isPrime = zahl%i == 0;
}
if (isPrime) std::cout<<zahl<<std::endl;
}


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

Dieser Post wurde am 21.07.2006 um 14:06 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.07.2006, 11:07 Uhr
Rumak18



Hallo. Ok. Habe es nun so wie virtual vorgeschlagen gemacht,allerdings bekomme ich als

Code:
Ausgabe nur :
-------------------------
1
2
Press any key to continue
-------------------------



Der Quellcode schaut so aus:

C++:
//Primzahlenausgabe

#include <stdio.h>
#include<iostream>
#include<math.h>
using namespace std;

int i;
int zahl;
int ergebnis;

int main()
{
    for(int zahl=1; zahl<200;zahl++)
    {
    bool isPrime = true;
        for(int i=2; i<zahl && isPrime;i++)
        {
        isPrime = zahl%i == 0;
        }
        if (isPrime)
        {
        std::cout<<zahl<<std::endl;
        }
    }
}



Nun habe ich auch noch den alten etwas anders überarbeitet und der schaut so aus:


C++:
//Primzahlenausgabe2

#include <stdio.h>
#include<iostream>
using namespace std;

int i;
int zahl;
int ergebnis;

int main()
{
    for (zahl=1; zahl<=200 ; zahl++)        "Zahl"(Der Dividend der Modulo Division)
    {
        for (i=2; i<zahl; i++)            
        {
        ergebnis = zahl % i;
        }
    if (ergebnis == 0)
        {
        printf("Das ist eine Primzahl:%d\n",zahl);
        }
        else
        {
        printf("Das ist keine Primzahl:%d\n",i);
        }
    }

}



Und hier bekomme ich als Ergebnis :

Code:
------------------------------------
Das ist eine Primzahl : 1
Das ist eine Primzahl : 2
Das ist keine Primzahl : 3
Das ist keine Primzahl : 4
...
------------------------------------



Wo liegt bei beiden der Fehler ???

mod edit: BENUTZE DIE BOARD TAGS SELBER
--
WinXP Pro
Athlon 3200 64
Geforce 6600 GT
HDD320 GB
Visual Basic 6.0

Dieser Post wurde am 21.07.2006 um 12:33 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.07.2006, 12:39 Uhr
Tommix



Bei Deiner Variante steht in ergebnis immer der Wert des letzten Schleifendurchlaufes, also zahl % (zahl-1), was immer 1 ist. Bei 1 und 2 wird die Schleife gar nicht durchlaufen, drum steht, da die Variable global ist, noch das initiale 0 drin.
Wenn Virtuals Programm nur 1 und 2 ausgibt, dann sind 1 und 2 die einzigen Primzahlen!

- Tommix


Bearbeitung von Tommix:
Es war die BOOLsche Unlogik:

C++:
        for(int i=2; i<zahl && isPrime; ++i){
            isPrime =  zahl%i != 0;
        }




Dieser Post wurde am 21.07.2006 um 12:52 Uhr von Tommix editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.07.2006, 13:08 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Tommix:
Wenn Virtuals Programm nur 1 und 2 ausgibt, dann sind 1 und 2 die einzigen Primzahlen!


Ich danke für Dein Vertrauen. kann man das vielleicht irgendwie ausnutzen?
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.07.2006, 13:31 Uhr
Rumak18



He??Wie....nur 1 und 2 sind Primzahlen??Was ist mit 3,5,7 etc???Ich versteh irgendwie echt nicht,wo meine Fehler sein sollen.In BEIDEN Codes.

Zitat:
mod edit: BENUTZE DIE BOARD TAGS SELBER

Weiss nicht,was der Mod mir damit sagen wollte.

Zitat:
ei Deiner Variante steht in ergebnis immer der Wert des letzten Schleifendurchlaufes, also zahl % (zahl-1), was immer 1 ist.
So was habe ich doch gar nicht in meinem Quellcode....
--
WinXP Pro
Athlon 3200 64
Geforce 6600 GT
HDD320 GB
Visual Basic 6.0
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
21.07.2006, 14:13 Uhr
0xdeadbeef
Gott
(Operator)


1 ist keine Primzahl, sondern ein Einteiler. Davon ab:

C++:
#include <stdio.h>

int is_prime(unsigned x) {
  int i, j = 4;

  if(x < 2) return 0;
  if(x == 2 || x == 3) return 1;

  if(x % 2 == 0 || x % 3 == 0) return 0;

  for(i = 5; i * i <= x; i += (j = 6 - j)) {
    if(x % i == 0)
      return 0;
  }

  return 1;
}

int main(void) {
  int i;
  for(i = 0; i < 100; ++i) {
    if(is_prime(i))
      printf("%d\n", i);
  }

  return 0;
}


Das ist jetzt zwar C, aber das ganze auf C++ umzumünzen dürfte trivial sein.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
21.07.2006, 15:34 Uhr
(un)wissender
Niveauwart


So geht es in C++ .


C++:
#include <algorithm>
#include <iostream>
#include <iterator>

bool is_prime(unsigned x)
{
    if(x < 2) return false;
    if(x < 4) return true;
    if(x % 2 == 0 || x % 3 == 0) return false;
    for(unsigned i = 5, j = 4; i * i <= x; i += (j = 6 - j))
    {
        if(x % i == 0)  return false;
    }
    return true;
}

class digitIterator
{
public:
    explicit digitIterator(unsigned i)
        :  _current(i)
    {
    }
        
    digitIterator operator++(int)
    {
        digitIterator t(_current++);
        return t;
    }
        
    digitIterator& operator++()
    {
        ++_current;
        return *this;
    }
    
    bool operator==(digitIterator const & other) const
    {
        return  _current == other._current;
    }  
    
    bool operator!=(digitIterator const & other) const
    {
        return !(*this == other);
    }  
    
    unsigned operator*() const
    {
        return _current;
    }    

private:
    unsigned _current;
};  

template<class InputIterator, class OutputIterator, class Pred>
OutputIterator copy_if(
      InputIterator first,
      InputIterator last,
      OutputIterator destBeg,
      Pred pred
   )
{
    while(first != last)
    {
        if(pred(*first))
        {
            *destBeg = *first;
            ++destBeg;
        }  
        ++first;
    }    
}    
  
  
int main()
{  
    copy_if(
        digitIterator(0),
        digitIterator(101),
        std::ostream_iterator<unsigned>(std::cout, " "),
        &is_prime);
}


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
21.07.2006, 15:42 Uhr
0xdeadbeef
Gott
(Operator)


...du bist ja wahnsinnig.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (ANSI-Standard) ]  


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: