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 ]
010
22.01.2007, 18:09 Uhr
Suba Esel



Meine Variante mit 93 Zeichen sieht so aus:

C++:
if(n==2)return 1;
if(n<2||n%2==0)return 0;
for(int i=3;i*i<=n;i+=2)if(n%i==0)return 0;return 1;


Ich hab erst überlegt, ob man da vielleicht Kronos' Variante mit einbauen könnte, aber das funktioniert nicht, weil man dann nicht mehr nur bis zu Wurzel laufen kann

@Kronos: jetzt erstmal dein Programm komplett kapieren^^
--
Simon

Dieser Post wurde am 22.01.2007 um 18:13 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
22.01.2007, 20:45 Uhr
Suba Esel



So, ich glaube, dass diese Version etwas schneller ist
Allerdings weiß ich nicht, ob sie wirklich richtige Ergebnisse liefert, da ich sie nicht mehr kapiere


C++:
if(n==2)return 1;
if(n<2||n%2==0)return 0;
int i=3;
for(;n%(i+=2)*i;)
;
return i==n;


--
Simon

Dieser Post wurde am 22.01.2007 um 20:45 Uhr von Suba Esel editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
23.01.2007, 22:58 Uhr
Bruder Leif
dances with systems
(Operator)


@Quotenfisch: Sehr elegant, aber fuer Werte unter 2 gibts ne Endlosschleife statt false. Ich hab das hier (40):


C++:
for(int j=2;j<n;n=n%j++?n:0);return n>1;


--
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
013
24.01.2007, 17:21 Uhr
kronos
Quotenfisch
(Operator)


@bruder:
stimmt nicht! es gibt einen integer overrun und man landet irgendwann bei -1 bzw. 0 --> keine primzahl
negative zahlen habe ich außer acht gelassen, weil zahl ja unsigned ist.
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
24.01.2007, 19:59 Uhr
0xdeadbeef
Gott
(Operator)


Selbst wenn du dich darauf verlassen könntest (was nicht der Fall ist), 1%0 rechnet man nochmal wie aus?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
24.01.2007, 20:35 Uhr
tobias
hmm....


sehe ich das richtig das man nur wissen muss, ob die eingabe eine primzahl ist oder nicht?

ganz easy... Regel: Primzahl ist durch sich (selbst oder durch 3) und durch 1 teilbar... ist beides der Fall, ist es eine primzahl...

Dabei darf die ausgabe keine kommazahl sein... ich schätze mal mit 10-15 zeilen kommt man da hin. werd morgen mal mein code posten wenn das hier noch aktuell ist.
--
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
25.01.2007, 02:09 Uhr
kronos
Quotenfisch
(Operator)



Zitat von 0xdeadbeef:
Selbst wenn du dich darauf verlassen könntest (was nicht der Fall ist),

Naja, auf welcher Architektur sollte das nicht funktionierten?


Zitat:
1%0 rechnet man nochmal wie aus?

Das mit der 0 war Unsinn von mir, da kommt das Programm nie hin. Endet bei -1.

@tobias: ja, bitte mach das
--
main($)??<-$<='?'>>2?main($-!!putchar(
(("$;99M?GD??(??/x0d??/a:???;a"+'?'/4)
??($??)+'?'/3-2-1+$%2)??''?')):'?';??>

Dieser Post wurde am 25.01.2007 um 02:22 Uhr von kronos editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
25.01.2007, 07:18 Uhr
Bruder Leif
dances with systems
(Operator)



Zitat von kronos:
@bruder:
stimmt nicht! es gibt einen integer overrun und man landet irgendwann bei -1 bzw. 0 --> keine primzahl



OK, habs kapiert. Hab die Funktion nur nie laenger als ein paar Minuten rechnen lassen
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.

Dieser Post wurde am 25.01.2007 um 07:19 Uhr von Bruder Leif editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
25.01.2007, 14:32 Uhr
Suba Esel



In dem ganzen ist sowieso noch ein Fehler drin:

bool isprime(int n) kann für einen Überlauf sorgen, weil in main() die Eingabe unsigned long long int ist, bool isprime(unsigned long long int n) ist demnach besser

Dies kann man gut überprüfen z.B. bei 1234567898765432111
Variante 1 behauptet, die Zahl wäre keine Primzahl, obwohl dies nicht stimmt.
--
Simon
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
25.01.2007, 18:11 Uhr
tobias
hmm....


also ich hab zwar 109 zeilen code, aber durch die kommentare halt...(sonst glaube ich 59 oderso)

ich hab es ganz anders gelöst, und es lässt sich kompilieren und funktioniert wunderbar...

Hier mal mein Code:


C++:
#include <iostream>
using namespace std;

//
// prototype unsere prime funktion
//
int prime(int zahl);

//
// das dos fenster
//
int main(void)
{
    //
    // der speicher für die eingegebene zahl
    //
    int eingabe;
    
    cout << "110 fuer Abbrechen" << '\n' << endl;
    
    //
    // wenn man 110 eingibt, wird programm beendet ansonsten einfach fortgefahren
    //
    while(eingabe != 110)
    {        
        cout << "Bitte gib deine Zahl ein, welche geprueft werden soll" << endl;
        cin >> eingabe;
        
        //
        // wenn unsere zahl eine prime ist...
        //
        if (prime(eingabe))
        {
           //
           // dann richtig ausgeben
           //
           cout << "Zahl ist eine Primzahl" << "\a\a\a" <<  '\n' << endl;
        }
        else
        {
            //
            // ansonsten das es keine ist
            //
            cout << "Zahl ist leider keine Primzahl" << '\n' << endl;
        }
    };
    
    return 0;
}

//
// die primfunktion
//
int prime(int zahl)
{
    //
    // wird als rückgabewert (true/false) benötigts
    //
    bool isprime = false;
    
    //
    // alle primzahlen(noch bei weitem nicht alle)
    //    
    int primes[] = {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, 101, 103, 107, 109, 113, 127, 131,
                    137, 139, 149, 151, 157, 163, 167, 173, 179,
                    181, 191, 193, 197, 199, 211, 223, 227, 229,
                    233, 239, 241, 251, 257, 263, 269, 271, 277,
                    281, 283, 293, 307, 311, 313, 317, 331, 337,
                    347, 349, 353, 359, 367, 373, 379, 383, 389,
                    397, 401, 409, 419, 421, 431, 433, 439, 443,
                    449, 457, 461, 463, 467, 479, 487, 491, 499,
                    503, 509, 521, 523, 541, 547, 557, 563, 569,
                    571, 577, 587, 593, 599, 601, 607, 613, 617,
                    619, 631, 641, 643, 647, 653, 659, 661, 673,
                    677, 683, 691, 701, 709, 719, 727, 733, 739,
                    743, 751, 757, 761, 769, 773, 787, 797, 809,
                    811, 821, 823, 827, 829, 839, 853, 857, 859,
                    863, 877, 881, 883, 887, 907, 911, 919, 929,
                    937, 941, 947, 953, 967, 971, 977, 983, 991,
                    997
                    };
    
    //
    // für die for schleife werden nun alle elemente des arrays gezählt
    //
    int elements = sizeof(primes)/sizeof(primes[0]);
    
    //
    // falls die zahl in unserem primearray vorkommt, ist es eine primezahl
    //
    for(int i = 0; i < elements; i++)
    {
            if (primes[i] == zahl)
            {
                isprime = true;
            }
    }
    
    return isprime;
}



Ich arbeite erst seit 2 wochen mit c++ aber hoffe, das es schonmal ein guter ansatz ist und würde mich über kritik freuen...

Wer es nicht kopieren will und compilieren, dem hab ich das mal als rar datei auf mein space geladen: www.greatbook.de/prime.rar

achja, bitte nix gegen meinen stil sagen... ich code so seit jahren in php und hier hab ich(muss ich ehrlich zugeben) mehr kommentiert alls es bräuchte.

edit: man könnte noch nach: isprime = true; ein break; reinhauen... würde evtl. noch die laufzeit der for verbessern.

edit2: werd mich gleich mal auf ne neue version hinsetzen, dazu muss ich noch forschen wie man variablen typen unterscheiden kann.(deshalb keine 15 zeilen version).. das ich alles was double ist, schonmal rausnehme, weil dieses ja automatisch keine prim ist.
--
Danke

Dieser Post wurde am 25.01.2007 um 18:17 Uhr von tobias editiert.
 
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: