Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » Primgolf

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 < [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]
020
25.01.2007, 19:48 Uhr
Suba Esel



Sorry, ich glaube, du hast meine "Aufgabe" nicht ganz richtig verstanden:


Zitat von Suba Esel:

Ich mein natürlich eine kurze und möglichst schnelle Methode^^



Damit meinte ich nicht, dass man die Primzahlen von 1 bis 1000 speichert und nachsieht, ob die eingegebene Zahl eine davon ist, mir ging es um weit höhere Primzahlen (z.B. 123456781 und 1234567898765432111) für eine Aufgabe wie z.B. diese hier.

Eine Frage noch: lernst du mit einem Buch C++, und wenn ja, mit welchem? Ich lern seit nem halben Jahr, und du bist ähnlich weit wie ich
--
Simon

Dieser Post wurde am 25.01.2007 um 19:48 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
021
25.01.2007, 20:04 Uhr
kronos
Quotenfisch
(Operator)


@Suba Esel: Naja, du solltest dich schon entscheiden ob es kurz oder schnell sein soll. Denn eine Liste aller Primzahlen bis MAX_LONG durchzugehen ist möglicherweise tatsächlich am schnellsten (vor allem bei hohen Zahlen)...
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
022
25.01.2007, 20:07 Uhr
Suba Esel



Ok, die Aufgabe war wirklich etwas schlecht gestellt: ich dachte erst an eine möglichst kurze Methode. Da aber zum Beispiel deine geniale Methode äußerst lange braucht, habe ich noch den Zusatz möglichst schnelle drangehängt.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
023
25.01.2007, 22:38 Uhr
Bruder Leif
dances with systems
(Operator)


@beefy: Wie waers mit Template-Metaprogramming?
--
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
024
26.01.2007, 23:36 Uhr
tobias
hmm....


hab da einen java code gefunden... vllt. kann man den in c++ umschreiben.

allerdings weis ich nicht ob der code komplett ist..


Code:

/*Primzahlencheck*/

import java.util.*;

public class prim    
{
public static void main(String[] args)    
  {
  int l,e;
  
  Scanner key = new Scanner(System.in);
  for (int n=0;n<2;n++) {
   System.out.println();
  }
  System.out.println("Bitte geben Sie die zu untersuchende Zahl ein!");
  System.out.println("Zahlenbereich: INT, jedoch nicht groesser als 15465453!"+"\n"+"\n");

/**pz ist die zu untersuchende Zahl*/

  int pz = key.nextInt();

/**das Array dient als Speicher für
*diejenigen Zahlen, durch die pz
*teilbar ist*/

  int[] z = new int[pz];    
  
/**c ist eine Variable, die zählt,
*durch wie viele Zahlen pz teilbar ist*/

  int c=0;
  for (l=1; l<=pz;l++) {

/**e ist das Ergebnis der Modulo-Division der
*von pz und der Laufvariablen l; wenn e=0 ist,
*dann ist die pz ohne Rest durch die Laufvariable
*teilbar; der Wert der Laufvariablen wird dann im
*Array-Element mit dem aktuellen Wert von c abgelegt*/

  e=pz%l;
   if (e == 0) {
    z[c]=l;
    c++;
   }
  }
  for (int n = 0; n<2;n++) {
   System.out.println();
  }
  if (pz==0) {
   System.out.println(pz+" ist keine Primzahl!");
  }
  if (pz==1) {
    System.out.println(pz+" ist keine Primzahl!");
  }
  if (pz>1) {
   if (c<=2) {
    System.out.println(pz+" ist eine Primzahl, da sie nur durch folgende Zahlen teilbar ist: "+"\n");
    for (int a=0; a<c; a++) {
     System.out.println("\t"+"\t"+(a+1)+"."+"\t"+z[a]);
    }
   } else {
    System.out.println(pz+" ist keine Primzahl, da sie durch folgende Zahlen teilbar ist: "+"\n");
    for (int a=0; a<c; a++) {
     System.out.println("\t"+"\t"+(a+1)+"."+"\t"+z[a]);
    }
   }
  }
  System.out.print("\n"+pz+" ist teilbar durch "+c+" Zahl");
  if (pz!=1) {
   System.out.println("en!");
  } else {
   System.out.println("!");
  }
  System.out.println("\n");
}
}


--
Danke

Dieser Post wurde am 26.01.2007 um 23:39 Uhr von tobias editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
025
26.01.2007, 23:41 Uhr
Suba Esel




Zitat von Kronos:
...eine Liste aller Primzahlen bis MAX_LONG durchzugehen ist möglicherweise tatsächlich am schnellsten (vor allem bei hohen Zahlen)...

Mit Sicherheit, aber: wie willst du an die Primzahlliste rankommen?

@tobias: Wo(mit) / wie lernst du C++?
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
026
26.01.2007, 23:48 Uhr
tobias
hmm....


und das hilft vllt. auch noch..

das ist das sieb des erathors oder wie der heinz da heißen mag.

Dieses funktioniert nach folgendem Prinzip:
Schreibt man eine Liste aller natürlichen Zahlen auf, die man überprüfen will, dann sieht das nachher z.B. so aus:


Hab hier ein wenig gestrichen.... hier waren die zahlen 1 bis 100 aufgelistet.. also:

1,2,3,4,5,6.................................................,99,100



a) Nun streicht man als erstes die 1 weg, da es sich bei 1 um keine Primzahl handelt.

b) Es folgt die 2. 2 wurde bis jetzt nicht weggestrichen und ist deshalb Primzahl. Wir markieren 2 als Primzahl.

c) Wir streichen nun alle durch 2 teilbaren Zahlen, weil diese nicht Primzahlen sein können. (Sie hätten jeweils die Teiler 1,2 und sich selbst)

d) Die 3 ist nun die nächste ungestrichene Zahl! Wir markieren 3 als Primzahl.

e) Wir streichen nun alle durch 3 teilbaren Zahlen, weil diese ebenfalls keine Primzahlen mehr sein können.

f) Nun wiederholen wir Schritt d) und e) bis alle Zahlen entweder als Primzahlen markiert, bzw. als Nichtprimzahlen durchgestrichen sind. Achtung: Diese Schritte müssen nur bis zur Zahl durchgeführt werden, die größer oder gleich der Wurzel des zu überprüfenden Bereich ist. z.B. 10 bei 100, 32 bei 1000, da 10 * 10 = 100 bzw. 32 * 32 = 1024 > 1000

Man erhält in dem oberen Beispiel nun eine Liste von Primzahlen: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97.
--
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
027
26.01.2007, 23:51 Uhr
tobias
hmm....


ich persönlich finde das mit der primzahlenliste auch am schnellsten... bin jetzt schon beim eintippen der primzahl: 9857..... wird zwar ein riesenarray ich denke ich mach bis 1 000 000 000 oderso und dann poste ich nochmal 3 seiten code...

XD
--
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
028
26.01.2007, 23:53 Uhr
Blubber2063



Naja das läuft letztenendes darauf hinaus eine Primfaktorzerlegung zu probieren. Dürfte ohne ne heuristik zu benutzen auch der vermutlich schnellste Weg sein. Allerdings ist es unnötig irgendwas zu streichen, es reicht 2 und 3 vorzugeben und dann kann man jede weiter zahl auf mögliche Primfaktorzerlegung mit den bis dahin bekannten Primzahlen. Gibt hier im Forum auch min 3 oder 4 Implentationen des ganzen, aber in dem Thread hier ging es nur um einen möglichst kurzen Code der einen Primzahl test macht.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
029
26.01.2007, 23:56 Uhr
Suba Esel



Tippst du die etwa per Hand ein?! Lass dir die doch von ner Funktion in ne Datei schreiben und die dann von dort aus in ein Array einlesen^^

@tobias: Wo(mit) / wie lernst du C++?
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] [ 2 ] > 3 < [ 4 ] [ 5 ] [ 6 ] [ 7 ] [ 8 ]     [ 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: