Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Primzahlen(komme nicht weiter)

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
15.08.2006, 17:02 Uhr
~Lucius}perca{
Gast


Hi

ich möchte ein Programm schreiben das jede Zahl von 0-"möglichst viel" testet und sie ausgibt falls sie eine Primahl ist.
Ich habe bis jetzt folgenden Code:


C++:
#include <iostream>
#include <windows.h>

static const int N = 30000;
#include <iostream>
int main()
{
   int i, a[N];

   for(i = 2; i < N; ++i) a[i] = 1;

   for(i = 2; i < N; ++i)
      if(a[i])
         for(int j = i; j*i < N; ++j)
            a[i*j] = 0;

   for (i = 2; i < N; ++i)
      if(a[i]) std::cout << i << " ";

   system("pause");

   return 0;
}



Funktioniert auch, ABER:
Da es aber int-variablen sind, kann ich max. Zahlen bis 32767 testen und ausgeben lassen.
Wenn ich daraus longs mache funzt es aber nicht.


Danke schon mal im voraus.

Weiß einer wie man das Problem lösen könnte(egal ob mit meinem Code oder nem anderen)



Bearbeitung von Bruder Leif:
Tags, Quellcode lesbar formatiert... hab meinen guten Tag heute

Dieser Post wurde am 15.08.2006 um 19:03 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.08.2006, 19:09 Uhr
Bruder Leif
dances with systems
(Operator)


OK, ändern wir den Code mal ein bisschen:
1. windows.h raus
2. system("pause") ist böse. Lieber mit getchar();
3. Zweimal iostream einbinden?

Dann haben wir:

C++:
#include <iostream>

static const int N = 30000;

int main()
{
   int i, a[N];

   for(i = 2; i < N; ++i) a[i] = 1;

   for(i = 2; i < N; ++i)
      if(a[i])
         for(int j = i; j*i < N; ++j)
            a[i*j] = 0;

   for (i = 2; i < N; ++i)
      if(a[i]) std::cout << i << " ";

   getchar();

   return 0;
}



Wenn ich dann jedes int (außer vor main) in long ändere, funktioniert immer noch alles. Bis zu welchem N probierst Du's denn? Hab da ne Theorie...
--
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
002
15.08.2006, 21:08 Uhr
xXx
Devil


außerdem würde ich mal davon ausgehen das die Zahl im positiven bereich ist... man setze ein unsigned vor das int ... und teste nochmal
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.08.2006, 10:38 Uhr
~Luciusperca
Gast


Vielen Dank schon mal!!!

Der Code sieht so schon wesentlich besser aus.

Allerdings bekomme ich, wenn ich z.B N=300000 nehme, nen Stack Overflow:

"Unbehandelte Ausnahme in prime.exe : 0xC00000FD: Stack Overflow."

Obwohl es doch jetzt alles longs sind
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.08.2006, 10:45 Uhr
~Luciusperca
Gast


Ich versuche N so hoch wie möglich zu bekommen.
Am besten noch höher als "unsigned long int( 0 - 4 294 967 295)".
Ich hab mal was von "unsigned long long int( 0 - 2^64-1)" gehört.
Ich weiß aber nich ob das funktioniert(glaube nur in ?C99?).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.08.2006, 10:58 Uhr
~Blubber2063
Gast


Also pass auf, du hast vermutlich das Problem das du zu wenig Stackspeicher reserviert hast, d.h. du setzt entweder mit deinem Compiler manuell ne größere Stacksize oder du machst dein Feld global, dann braucht er den nicht aufm Stack anlegen, bei 300000 long werten sind das auf meinem system knapp 1,2kb(bezogen darauf das long und int 4 byte breit sind, was bei deinem Compiler anders sein kann) wenn du den grösstmöglichen atomaren Datentypen nehmen willst brauchst du ein unsigned long long, da ist eigentlich fast immer(auf 32 Bit maschinen) ein 64 bit Datentyp.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.08.2006, 12:06 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hi,das problem ist, das du nicht 16GB (auf 32bit systemen) Stackspeicher reservieren kannst (wenn du für N das maximale von unsigned long nimmst). Für was benutzt du überhaupt das array? wenn du die primzahlen nur ausgeben willst ist das unnötig.

Ansonsten kommt bei deinem Code immer nur für die 1 eine Primzahl raus.

Siehe ein paar Threads tiefer andere Primzahlberechnungsvarianten.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
16.08.2006, 13:36 Uhr
~Luciusperca
Gast


Wie setzt man denn die Stacksize manuell hoch?
Ich hab dazu was in der MSDN gelesen aber ich habs nich hingekriegt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
16.08.2006, 14:48 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Wie kommst du denn auf 16 GB Flo?

@Luciusperca
Was für eine Betriebssystem und was für einen Compiler verwendest du?
Wenn du sagst das du mit int nur bis 32000 kommst dann ist int bei dir ja nur 16 Bit breit...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
16.08.2006, 18:44 Uhr
~Luciusperca
Gast


Ich habe "Microsoft Windows XP Professional SP1a" und ich verwende "Microsoft Visual C++ 6.0 Professional Edition".

Soweit ich weiß geht int bei meinem Compiler immer nur bis 32767.
Fürs doppelte kann ich ja unsigned int nehmen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


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: