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 ]
010
22.07.2006, 03:25 Uhr
Rumak18



Das denke ich mir auch,vor allem wenn ich bedenke,dass man doch bestimmt keine Klassen für die Lösung dieser Aufgabe braucht. @virtual: Ich weiss erstens immer noch nicht,was ich in meinen "verbesserten" Quellcodes falsch habe, ausserdem stimmt ja deiner nicht,wenn nur 1 und 2 als Primzahlen ausgegeben werden.
--
WinXP Pro
Athlon 3200 64
Geforce 6600 GT
HDD320 GB
Visual Basic 6.0
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
22.07.2006, 05:45 Uhr
Hans
Library Walker
(Operator)



Zitat von Rumak18:


Zitat:
mod edit: BENUTZE DIE BOARD TAGS SELBER

Weiss nicht,was der Mod mir damit sagen wollte.


Hi,
er meint damit, das Du Quelltext Zwischen den sogenannten Tags schreiben solltst, also so:

Code:
(cpp)
hier jetzt Dein Quelltext
(/cpp)


Dabei sind die runden Klammern durch eckige Klammenr zu ersetzten. Der Effekt dieser Massnahme ist die formatierte Ausgabe Deines Quellcodes.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
22.07.2006, 10:06 Uhr
(un)wissender
Niveauwart


@beefy
Darum finde ich C++ so toll. Man kann kurze und übersichtliche C-Lösungen in eine extrem lange und toll generische Variante umwandeln. Warum kurz, einfach und übersichtlich, wenn es auch anders geht?
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
22.07.2006, 11:02 Uhr
Pablo
Supertux
(Operator)


dann hättest du gleich ein Programm für einen Keller Automat oder Turing Machine angeben können
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
22.07.2006, 21:20 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat von Rumak18:
Das denke ich mir auch,vor allem wenn ich bedenke,dass man doch bestimmt keine Klassen für die Lösung dieser Aufgabe braucht. @virtual: Ich weiss erstens immer noch nicht,was ich in meinen "verbesserten" Quellcodes falsch habe, ausserdem stimmt ja deiner nicht,wenn nur 1 und 2 als Primzahlen ausgegeben werden.



Hallo,

ich hatte das Programm nicht getestet und prompt auch einen Fehler reingebaut. Richtig wäre vermutlich (wieder ohne Test):

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



Wobei bei der inneren Schleife - der eigentliche Primzahltest hochgradig Optimierungspotential drin ist. Zur weiteren Klärung:

Eine Zahl ist eine Primzahl, wenn sie genau zwei Teiler hat (nämlich1 und sich selbst). In jüngerere Zeit definiert man daß 1 keine Primzahl ist, früher hatte man 1 auch als Primzahl angesehen. Ist letztlich eine reine Definitionsfrage. Wie dem auch sei: eine zahl N ist somit Primzahl, wenn es keine Zahl zwischen 2 und N-1 gibt, durch die sich N restlos Teilen ließe. Formal also


Code:
n ist Primzahl <=> für alle 2<=i<n: n%i!=0



Genau dies drückt der innere Teil der Schleife aus. Dh es ist jedenfalls notwenig, wirklich alleZahlen zwischen 2 und N-1 zu überprüfen, ob N eine Primzahl ist. Wie Du unschwer anhand deines Codes sehen kannst, machst du das nicht.

Wenn ich nun sage, daß man alle Zahlen zwischen 2 und N-1 überprüfen müsste, ist das natürlich nicht ganz wahr:

Angenommen, n wäre keine Primzahl, also als Produkt zweier Zahlen a,b >=2 darstellbar: N= a*b, dann kann man beweisen, daß mindestens eine der beiden Zahlen gleichzeitig kleiner oder gleich de Wurzel von N ist (dementsprechend die andere größer oder gleich). Deshalb kann man den zu testenden Zahlenbreich schon man auf 2-sqrt(N) einschränken. Üblicherweise kann mann noch weitere Einschränkungen machen, zB daß man diesen Zahlenbreich mit einer bstimmten Schrittgröße durchmisst und nicht wirklich jede Zahl prüfen muß, dh man kann noch optimieren.
--
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
015
23.07.2006, 00:24 Uhr
Pablo
Supertux
(Operator)



Zitat von virtual:
In jüngerere Zeit definiert man daß 1 keine Primzahl ist, früher hatte man 1 auch als Primzahl angesehen. Ist letztlich eine reine Definitionsfrage.


nicht ganz. In der Algebra (in kommutativen Ringen) ist eine Element c != 0 prim, wenn es keine Einheit ist und für alle Elemente a und b gilt: Teilt c das Produkt a·b , so folgt stets c teilt a oder c teilt b, sprich

\forall a,b\in R: c | ab => c|a oder c|b

Eine Einheit ist ein Teiler der 1. Da die 1 im Ring der ganzen Zahlen die 1 teilt, ist 1 eine Einheit und per Definition kein Primelement. Insbesondere gibt es keine Prim Elemnte auf Körper.

Die Primzahlen sind nur ein Beispiel der Primelemente, deswegen ist die 1 keine Primzahl. Siehe http://de.wikipedia.org/wiki/Primelement
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 23.07.2006 um 00:26 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
23.07.2006, 02:53 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)



Zitat von 0xdeadbeef:
...du bist ja wahnsinnig.

Ganz diener Meinung ...
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
24.07.2006, 08:47 Uhr
Rumak18



@Virtual : Wow. Danke. Endlich mal eine kurze Knackige und hilfreiche Antwort.Der Code funktioniert also.Dennoch würde ich gerne erfahren, was am folgenden Quellcode falsch ist

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",zahl);
            }
        }
    }

}


--
WinXP Pro
Athlon 3200 64
Geforce 6600 GT
HDD320 GB
Visual Basic 6.0
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
24.07.2006, 09:29 Uhr
virtual
Sexiest Bit alive
(Operator)


Du gibts gemessen am Algorithmus den Falschen text aus. Wird es Dir klarer, wenn ich Dir die Ausgabe korrigiere?

C++:
           if (ergebnis != 0)
            {
                printf("%d ist nicht durch %d teilbar\n", zahl, i);
            }
            else
            {
                printf("%d ist durch %d teilbar\n", zahl, i);
            }


Aus meinem vorherigen Post solltest Du also zwei Dinge eigentlich erkennen:

1. Innerhalb der inneren Schleife - welche ja die möglichen Teiler überprüft - solltest Du überhaupt keine Ausgabe machen, weil Du - wie bereits gesagt - erstmal alle Zahlen überprüfen mußt, bevor du erkennst, ob es eine Primzahl ist oder nidcht.

2. Die innere Forschleife geht von (incl.) 1 bis zahl. Auch das habe ich bereits beswchrieben: die max. (unoptimierte) grenzen liegen bei (incl) 2 bis zahl-1
--
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
019
24.07.2006, 09:35 Uhr
(un)wissender
Niveauwart


So geht aber hier sind schon bessere Lösungen gepostet worden.


C++:
#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)
    {
        bool found = false;
        for (i=2; i<zahl; i++)                 //Innere Schleife : Inkremetierung von "i"(Der Divisor der Modula Division)
        {
            ergebnis = zahl % i;      
            if (ergebnis == 0)
            {
                printf("Das ist keine Primzahl:%d\n",zahl);
                found = true;
                break;
            }
        }
        
        if(!found)
        printf("Das ist eine Primzahl:%d\n",zahl);
              
    }

}




Bearbeitung:

Zu langsam...


--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 24.07.2006 um 09:36 Uhr von (un)wissender editiert.
 
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: