Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15
  1. #1
    Anfänger
    Registriert seit
    21.07.2008
    Beiträge
    8

    Standard Mein erstes Programm!! [Prime95 Konkurrenz xD]

    So hab mal mein erstes halbwegs nützliches Programm gebastelt!

    Es ist ein Programm, dass nach eingaber einer Zahl (die übrigens bis zu 18 trillionen groß sein darf ^^) prüft ob eine Zahl eine Primzahl ist oder nicht,
    falls nicht, zeigt es den kleinstmöglichen Teiler der Zahl!

    Man kann es aber auch als CPU Stresstest Tool benutzen! XD
    Ne 9 stellige Primzahl schafft mein Quad Core in ca. 10 sekunden...und ja..das Programm nutzt irgendwie alle Cores aus...fragt mich nicht wieso..^^

    Bugs die mir schon bekannt sind, ich aber zu blöd bin sie zu fixen:
    -falls man buchstaben eingibt wenn man eigentlich Zahlen eingeben sollte, schmiert das Prog ab ^^

    Feedback zum Code und Verbesserungsvorschläge sowie weitere Anregungen was an was ich mich in Zukunft versuchen soll erwünscht! ^^

    Links:
    http://home.arcor.de/sh4w0r/Prime.cpp <- Source
    http://home.arcor.de/sh4w0r/Prime.exe <- Prog

  2. #2
    DateMake Dialer
    Registriert seit
    14.06.2007
    Beiträge
    104

    Standard

    Soweit ich weiß, kriegste mit der BigInteger Klasse so große Zahlen hin, wie du magst.
    Jedenfalls is das in Java so
    Müsst in C das selbe sein.

  3. #3
    Der mit Anatidaephobie Avatar von blackberry
    Registriert seit
    11.07.2008
    Beiträge
    2.350

    Standard

    @sh4w
    Code:
    if(divisor > max || divisor > prime)
    ... ergibt keinen richtigen Sinn!
    Wenn ich davon ausgehe, dass max mit 0xFFFFFFFFFFFFFFFF gefüllt ist (maximaler Wert für einen unsigned long long int), dann ist if (divisor > max) nicht möglich, da nach einem Überlauf dein divisor zu 0 wird (was dein Programm nicht bemerkt, es aber beim nächsten Teilen, aufgrund einer Division durch 0, zum Absturz bringen wird).

    Es würde auch soetwas reichen:
    Code:
    if(divisor > (max - 1) || divisor >= (prime / 2 + 1))
    Ansonsten werden ja Zahlen gecheckt, die aus dem rein logischen schon keine Teiler mehr sein können - wenn ein Teiler größer ist als die Hälfte der Zahl, dann kommt in der Regel nie ein Ergebnis aus dem Bereich der natürlichen Zahlen raus.


    mfG. BlackBerry

    PDFTT cr3w a.E. — ReiDC0Re, lindor, Sera, berry
    please do feed the trolls crew and elk
    Ehrenwerte Mitglieder im Ruhestand: OpCodez, SFX.
    "Was sich blackberry gerade denkt" — Vorsicht! Frei laufender Wahnsinn!
    Zitat von fuckinghot19: "PS: Blackberry ist auf FH der Trollkönig ^^."
    An dieser Stelle danke ich all meinen Fans und Hatern gleichermaßen ^.^

  4. #4
    W32.SwineFlu Avatar von Sirect
    Registriert seit
    24.07.2008
    Beiträge
    1.916

    Standard

    Also wenn ich ne 9-Stellige Zahl eingebe dann ist die Direkt ausgerechnet, gebe ich eine Extrem lange Zahl ein dann startet das Programm immer wieder,fragt mich, und das immer wieder...

  5. #5
    Anfänger
    Registriert seit
    21.07.2008
    Beiträge
    8

    Standard

    Zitat Zitat von BlackBerry Beitrag anzeigen
    @sh4w
    Code:
    if(divisor > max || divisor > prime)
    ... ergibt keinen richtigen Sinn!
    Wenn ich davon ausgehe, dass max mit 0xFFFFFFFFFFFFFFFF gefüllt ist (maximaler Wert für einen unsigned long long int), dann ist if (divisor > max) nicht möglich, da nach einem Überlauf dein divisor zu 0 wird (was dein Programm nicht bemerkt, es aber beim nächsten Teilen, aufgrund einer Division durch 0, zum Absturz bringen wird).

    Es würde auch soetwas reichen:
    Code:
    if(divisor > (max - 1) || divisor >= (prime / 2 + 1))
    Ansonsten werden ja Zahlen gecheckt, die aus dem rein logischen schon keine Teiler mehr sein können - wenn ein Teiler größer ist als die Hälfte der Zahl, dann kommt in der Regel nie ein Ergebnis aus dem Bereich der natürlichen Zahlen raus.


    mfG. BlackBerry

    Danke für den Tipp!! ^___^
    Zahlen werden jetzt um einiges schneller ausgerechnet ^^


    Zitat Zitat von Sirect Beitrag anzeigen
    Also wenn ich ne 9-Stellige Zahl eingebe dann ist die Direkt ausgerechnet, gebe ich eine Extrem lange Zahl ein dann startet das Programm immer wieder,fragt mich, und das immer wieder...
    Das lieget daran dass die meisten großen zahlen eienen teiler von 2-10 haben, diese werden dann natürlich schnell herausgefunden, da das programm alle teiler von 2 - 9 trillionen (statt 18 trillionen dank blackberry ^^) ausprobiert... D.h. wenn eine Zahl einen niedrigen teiler hat, wird diese sehr schnell berechnet =)

  6. #6
    Neuling
    Registriert seit
    31.01.2009
    Beiträge
    2

    Standard

    Was ich mir noch überlegt habe:
    1.
    Code:
    if(divisor > (max - 1) || divisor >= (prime / 3 + 1))
    nach prime/3 kommt ja nur noch eine natürliche Zahl als Teiler: Prime/2. Diese ist aber immer x.5 also unerheblich für Primzahlen, oder man hat eine gerade Zahl eingegeben. Die sind aber durch 2 Teilbar und fallen vorher weg, oder irre ich mich da?
    und 2.
    Code:
    if(divisor < 3)
            divisor = divisor + 1LL;
            else
            divisor = divisor + 2LL;
    Wenn eine Zahl durch 2,4,6,8,10 etc teilbar ist, ist sie durch 2 Teilbar, fällt also schon vorher weg. Wenn meine Überlegungen stimmen würde es also ausreichen durch 3,5,7,9 etc zu teilen.
    Wenn ich irgendwo einen Denkfehler habe, sagt Bescheid.

  7. #7
    CIH-Virus Avatar von -[RiDER]-
    Registriert seit
    05.01.2007
    Beiträge
    496

    Standard

    Hi
    Zitat Zitat von cobhc Beitrag anzeigen
    Was ich mir noch überlegt habe:
    Code:
    if(divisor > (max - 1) || divisor >= (prime / 3 + 1))
    nach prime/3 kommt ja nur noch eine natürliche Zahl als Teiler: Prime/2. Diese ist aber immer x.5 also unerheblich für Primzahlen, oder man hat eine gerade Zahl eingegeben. Die sind aber durch 2 Teilbar und fallen vorher weg, oder irre ich mich da?
    Ich kann keine immanente mathematische Substanz in diesem Absatz finden.
    Entweder verstehe ich Dich falsch, oder Du irrst Dich.
    Zitat Zitat von cobhc Beitrag anzeigen
    Wenn eine Zahl durch 2,4,6,8,10 etc teilbar ist, ist sie durch 2 Teilbar, fällt also schon vorher weg. Wenn meine Überlegungen stimmen würde es also ausreichen durch 3,5,7,9 etc zu teilen.
    Eine Primzahl ist eine Zahl, die nur durch 1 und durch sich selbst teilbar ist.
    D.h. dass genau keine Division aufgehen darf!

    Du versuchst quasi alle Primzahlen auszurechnen (die Neun ist übrigens keine!) und das ist ein größerer Aufwand.

    Wenn Du (ohne Rechnen) vorhersagen könntest, durch welche Zahlen sich eine Zahl nicht teilen lässt, würdest Du die Mathematik revolutionieren, denn dass hat bisher noch keiner geschafft.

    Oder meinst Du das "streichen" von Nicht-Primzahlen?
    Also alle Zahlen der Zweierreihe aussortieren (bleiben 3, 5, 7, 9, 11, 13, 15, 17, 19...), dann alle Zahlen der Dreierreihe (bleiben 5, 7, 11, 13, 17, 19...), alle der Fünferreihe (Viererreihe fällt weg, weil durch Zweierreihe bereits aussortiert, bleiben 7, 11, 13, 17, 19...).
    Am Ende bleibt eine riesige Liste von allen Primzahlen, die kleiner (oder im Idealfall: gleich) sind als die gewünschte Zahl.
    Ist programmiertechnisch aber nur umständlich zu lösen (z.B. über verkettete Listen).

    GreetZ RiDER

  8. #8
    Neuling
    Registriert seit
    31.01.2009
    Beiträge
    2

    Standard

    Code:
    primenew = prime % divisor;
                  
          if(primenew == 0LL)
          {
            cout<<"\n\n\nThats not a prime number...\n";
            cout<<"Divisor found: " <<divisor <<"\n\n";
            break;
          }
          else
          {
            if(divisor > (max - 1) || divisor >= (prime / 2 + 1))
            {
              cout<<"\n\n\nPrime number found!!\n\n";
              break;
            }
            
            divisor = divisor + 1LL;
    Das Programm teilt eine Zahl prime solange durch den divisor, bis der divisor entweder größer als die Hälfte der Zahl ist, oder er eine restlose division durchführen kann, richtig?
    Also durch 1,2,3,4,...,X/2+1.
    Wenn nun aber X/2 keine Natürliche Zahl ergibt, dann kann auch X/4, X/6 etc keine natürliche Zahl mehr sein, also lohnt es sich nicht diese Zahlen zu berechnen. Deshalb
    Code:
    divisor = divisor + 2LL;
    Das Programm soll ja nur herausfinden ob die Zahl X eine Primzahl ist.

    Über das andere würde ich gerne noch mal nachdenken, was ich mir dabei gedacht habe :S

  9. #9
    I ❤ HouseMusic Avatar von FormChanger
    Registriert seit
    11.08.2008
    Beiträge
    529

    Standard

    toll - was kann man dazu noch sagen?

  10. #10
    Fortgeschrittener
    Registriert seit
    26.06.2007
    Beiträge
    48

    Standard

    Das kleine Buchstaben Problem sollte mit "FormatException" gelöst sein. So ist das in c#

Seite 1 von 2 12 LetzteLetzte

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •