<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Anfängerproblemchen mit recht schwieriger Aufgabe]]></title><description><![CDATA[<p>Hallo liebe C++ - Gemeinde,</p>
<p>ich habe folgende Aufgabe:</p>
<blockquote>
<p>Schreiben Sie ein Programm für die Primfaktorzerlegung einer natürlichen Zahl. Eine Funktion für die Eingabe soll prüfen, ob diese überhaupt zulässig ist (natürliche Zahl) und sonst zur erneuten Eingabe auffordern. Die Generierung/Prüfung von Primzahlen sowie die eigentliche Zerlegung sind in eigenständigen Funktionen zu realisieren.</p>
</blockquote>
<p>Ich habe dazu nun folgenden Code geschrieben:</p>
<pre><code>#include &lt;iostream&gt;

// ------- Nebenfunktionen-------

// &gt;Eingabe
int eingabe (int x) {
  std::cout&lt;&lt;&quot;Bitte geben sie eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
  std::cin&gt;&gt;x;
  while (x&lt;1) {
    std::cout&lt;&lt;&quot;Die eingegebene Zahl ist nicht natuerlich!\nBitte geben sie erneut eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
    std::cin&gt;&gt;x;
  }
  return x;
}

// &gt;Test ob Primzahl
int primtest (int p) {
  int zaehler;

  if (p &lt; 2) return 0;

  if (p == 2) return 1;

  if (p %2 == 0) return 0;

  for (zaehler = 3; zaehler * zaehler &lt;= p; zaehler = zaehler+2) {
    if (p % zaehler == 0) return 0;
  }

  return 1;
}

// &gt;Primzahlzerlegung
void primzer (int y) {

   int i;

  while (y &gt; 1) {
    i = 2;

    while ((y%i != 0) &amp;&amp; (primtest(i) == 0)) {
      i = i + 1;
    }
    std::cout&lt;&lt;i&lt;&lt;&quot; &quot;&lt;&lt;y&lt;&lt;&quot;\n&quot;;
    y = y/i;
  }
}

// ------ Hauptfunktion -----------

int main () {
  int n;

  std::cout&lt;&lt;&quot;Primfaktorzerlegung einer natuerlichen Zahl\n ------------------------- &quot;&lt;&lt;std::endl;

  eingabe (n);

  primzer (n);

  return 0;
}
</code></pre>
<p>Mein Problem ist nun: Ich denke eigentlich müssten die einzelnen Funktionen(Eingabe, Primzahlentest, Primzahlenzerlegung) von der Sache her stimmen, lass mich natürlich auch eines besseren Belehren! Doch wenn ich dieses Programm nun teste, wird der eingegebene Wert von der Eingabefunktion nicht weiter an die zweite Funktion übergeben (so sieht das zumindest aus wenn ich &quot;y&quot; mit ausgeben lasse) und ich komm einfach nicht drauf warum?! Ich hab da jetzt schon eine Ewigkeit dran rumprobiert...doch leider ohne Erfolg!</p>
<p>Kann mir hier evtl. jemand weiter helfen?</p>
<p>Vielen Dank schonmal,<br />
Beste GRüße,<br />
Chillee</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/277751/anfängerproblemchen-mit-recht-schwieriger-aufgabe</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Jul 2026 16:32:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/277751.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Nov 2010 21:17:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Tue, 23 Nov 2010 21:17:22 GMT]]></title><description><![CDATA[<p>Hallo liebe C++ - Gemeinde,</p>
<p>ich habe folgende Aufgabe:</p>
<blockquote>
<p>Schreiben Sie ein Programm für die Primfaktorzerlegung einer natürlichen Zahl. Eine Funktion für die Eingabe soll prüfen, ob diese überhaupt zulässig ist (natürliche Zahl) und sonst zur erneuten Eingabe auffordern. Die Generierung/Prüfung von Primzahlen sowie die eigentliche Zerlegung sind in eigenständigen Funktionen zu realisieren.</p>
</blockquote>
<p>Ich habe dazu nun folgenden Code geschrieben:</p>
<pre><code>#include &lt;iostream&gt;

// ------- Nebenfunktionen-------

// &gt;Eingabe
int eingabe (int x) {
  std::cout&lt;&lt;&quot;Bitte geben sie eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
  std::cin&gt;&gt;x;
  while (x&lt;1) {
    std::cout&lt;&lt;&quot;Die eingegebene Zahl ist nicht natuerlich!\nBitte geben sie erneut eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
    std::cin&gt;&gt;x;
  }
  return x;
}

// &gt;Test ob Primzahl
int primtest (int p) {
  int zaehler;

  if (p &lt; 2) return 0;

  if (p == 2) return 1;

  if (p %2 == 0) return 0;

  for (zaehler = 3; zaehler * zaehler &lt;= p; zaehler = zaehler+2) {
    if (p % zaehler == 0) return 0;
  }

  return 1;
}

// &gt;Primzahlzerlegung
void primzer (int y) {

   int i;

  while (y &gt; 1) {
    i = 2;

    while ((y%i != 0) &amp;&amp; (primtest(i) == 0)) {
      i = i + 1;
    }
    std::cout&lt;&lt;i&lt;&lt;&quot; &quot;&lt;&lt;y&lt;&lt;&quot;\n&quot;;
    y = y/i;
  }
}

// ------ Hauptfunktion -----------

int main () {
  int n;

  std::cout&lt;&lt;&quot;Primfaktorzerlegung einer natuerlichen Zahl\n ------------------------- &quot;&lt;&lt;std::endl;

  eingabe (n);

  primzer (n);

  return 0;
}
</code></pre>
<p>Mein Problem ist nun: Ich denke eigentlich müssten die einzelnen Funktionen(Eingabe, Primzahlentest, Primzahlenzerlegung) von der Sache her stimmen, lass mich natürlich auch eines besseren Belehren! Doch wenn ich dieses Programm nun teste, wird der eingegebene Wert von der Eingabefunktion nicht weiter an die zweite Funktion übergeben (so sieht das zumindest aus wenn ich &quot;y&quot; mit ausgeben lasse) und ich komm einfach nicht drauf warum?! Ich hab da jetzt schon eine Ewigkeit dran rumprobiert...doch leider ohne Erfolg!</p>
<p>Kann mir hier evtl. jemand weiter helfen?</p>
<p>Vielen Dank schonmal,<br />
Beste GRüße,<br />
Chillee</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984859</guid><dc:creator><![CDATA[Chillee]]></dc:creator><pubDate>Tue, 23 Nov 2010 21:17:22 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Tue, 23 Nov 2010 21:21:58 GMT]]></title><description><![CDATA[<p>du hast zwei Möglichkeiten:<br />
a. Wert per Referenc übergeben<br />
b. Den Rückgabewert einer Variablen zuweisen</p>
<p>a. sieht so aus:</p>
<pre><code class="language-cpp">int eingabe (int&amp; x)
</code></pre>
<p>b. sieht so aus:</p>
<pre><code class="language-cpp">n = eingabe (n);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984865</guid><dc:creator><![CDATA[HighLigerBiMBam]]></dc:creator><pubDate>Tue, 23 Nov 2010 21:21:58 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Tue, 23 Nov 2010 21:22:41 GMT]]></title><description><![CDATA[<p>Chillee schrieb:</p>
<blockquote>
<p>Doch wenn ich dieses Programm nun teste, wird der eingegebene Wert von der Eingabefunktion nicht weiter an die zweite Funktion übergeben</p>
</blockquote>
<p>Änder das mal in:</p>
<pre><code class="language-cpp">int eingabe () {
int x;
...
</code></pre>
<p>und:</p>
<pre><code class="language-cpp">...
n = eingabe();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984867</guid><dc:creator><![CDATA[Belli]]></dc:creator><pubDate>Tue, 23 Nov 2010 21:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Tue, 23 Nov 2010 21:33:36 GMT]]></title><description><![CDATA[<p>Gratulation! Du hast Den Draht zum Rechner. Selten so einen schönen Newbie-Code gesehen. Weiter so!<br />
Ich hab ihn mal fertiggemacht. (Durch Wegwerfen der primetest-Bedingung, wie Du überrascherweise festestellen wirst, hihi. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> )</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ------- Nebenfunktionen-------

// &gt;Eingabe
int eingabe ()
{
    int x;
    std::cout&lt;&lt;&quot;Bitte geben sie eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
    std::cin&gt;&gt;x;
    while (x&lt;1)
    {
        std::cout&lt;&lt;&quot;Die eingegebene Zahl ist nicht natuerlich!\nBitte geben sie erneut eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
        std::cin&gt;&gt;x;
    }
    return x;
}

// &gt;Test ob Primzahl
int primtest (int p)
{
    int zaehler;

    if (p &lt; 2) return 0;

    if (p == 2) return 1;

    if (p %2 == 0) return 0;

    for (zaehler = 3; zaehler * zaehler &lt;= p; zaehler = zaehler+2)
    {
        if (p % zaehler == 0) return 0;
    }

    return 1;
}

// &gt;Primzahlzerlegung
void primzer (int y)
{

    int i;

    while (y &gt; 1)
    {
        i = 2;

        while ((y%i != 0) )
        {
            i = i + 1;
        }
        std::cout&lt;&lt;i&lt;&lt;&quot; &quot;&lt;&lt;y&lt;&lt;&quot;\n&quot;;
        y = y/i;
    }
}

// ------ Hauptfunktion -----------

int main ()
{

    std::cout&lt;&lt;&quot;Primfaktorzerlegung einer natuerlichen Zahl\n ------------------------- &quot;&lt;&lt;std::endl;

    int n=eingabe();

    primzer(n);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984876</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 23 Nov 2010 21:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Tue, 23 Nov 2010 23:38:18 GMT]]></title><description><![CDATA[<p>Das mag zwar funktionieren, war aber nicht die Aufgabe: Berechnung der Primzahlen und die Zerlegung sollen in zwei <em>getrennten</em> Funktionen erfolgen. Und das nicht ohne Grund. Dein Algorithmus ist zudem recht ineffektiv:</p>
<ul>
<li>Nach jeder Teilung y=y/i wird i wieder auf 2 gesetzt, auch wenn alle Primfaktoren 2 bereits längst erledigt sind. Von da an werden <strong>alle</strong> Zahlen jedes Mal aufs Neue durchprobiert, um zum nächsten Primfaktor des aktuellen y zu gelangen, anstatt beim aktuellen i einfach weiterzumachen.</li>
<li>Es werden auch die <em>Vielfachen von Primzahlen</em> als mögliche Teiler in y%i in Erwägung gezogen, obwohl diese selbst als Primfaktoren nicht in Frage kommen <em>können</em>. Viele unnötige Divisionen.</li>
</ul>
<p>Tip: Der Herr Eratosthenes hat da mal so ein Sieb erfunden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1984917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984917</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Tue, 23 Nov 2010 23:38:18 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 05:33:16 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Das mag zwar funktionieren, war aber nicht die Aufgabe: Berechnung der Primzahlen und die Zerlegung sollen in zwei <em>getrennten</em> Funktionen erfolgen.</p>
</blockquote>
<p>Oh, stimmt.</p>
<p>minastaros schrieb:</p>
<blockquote>
<p>Und das nicht ohne Grund.</p>
</blockquote>
<p>Doch, ich fürchte, die Bedingung ist völlig ohne Grund. Sowohl bei trial division als auch beim Sieb des Eratosthenes ist ein Vortest auf Primalität der Teiler Zeitverschwendung.</p>
<p>minastaros schrieb:</p>
<blockquote>
<p>Nach jeder Teilung y=y/i wird i wieder auf 2 gesetzt, auch wenn alle Primfaktoren 2 bereits längst erledigt sind.</p>
</blockquote>
<p>Habs weggemacht.</p>
<p>minastaros schrieb:</p>
<blockquote>
<p>Es werden auch die <em>Vielfachen von Primzahlen</em> als mögliche Teiler in y%i in Erwägung gezogen, obwohl diese selbst als Primfaktoren nicht in Frage kommen <em>können</em>. Viele unnötige Divisionen.</p>
</blockquote>
<p>Nicht wirklich.</p>
<pre><code class="language-cpp">void primzer (int y)
{

    int i=1;

    while (y &gt; 1)
    {

        do
        {
            i = i + 1;
        }while (!primtest(i));

        while(y%i==0)
        {
            std::cout&lt;&lt;i&lt;&lt;&quot; &quot;&lt;&lt;y&lt;&lt;&quot;\n&quot;;
            y = y/i;
        }
    }
}
//Der Code riecht nicht hübsch. Irgendwas stimmt daran nicht.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1984947</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1984947</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 24 Nov 2010 05:33:16 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 15:39:01 GMT]]></title><description><![CDATA[<p>Erstmal vielen Dank für die zahlreichen Antworten.</p>
<p>Also die Eingabe habe ich nun so gefixt:</p>
<pre><code class="language-cpp">// &gt;Eingabe
int eingabe (void) {
  int x = 0;
  std::cout&lt;&lt;&quot;Bitte geben sie eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
  std::cin&gt;&gt;x;
  while (x&lt;1) {
    std::cout&lt;&lt;&quot;Die eingegebene Zahl ist nicht natuerlich!\nBitte geben sie erneut eine natuerliche Zahl ein: &quot;&lt;&lt;std::endl;
    std::cin&gt;&gt;x;
  }
  return x;
}

//in der main so:
n = eingabe();
</code></pre>
<p>So mit muss jetzt bloß noch die Zerlegung gemacht werden...</p>
<p>Danke für die geänderten Zeilen, aber<br />
kannst du mir diesen Teil nochmal erklären?</p>
<pre><code class="language-cpp">do
        {
            i = i + 1;
        }while (!primtest(i));

        while(y%i==0)
        {
            std::cout&lt;&lt;i&lt;&lt;&quot; &quot;&lt;&lt;y&lt;&lt;&quot;\n&quot;;
            y = y/i;
        }
</code></pre>
<p>Ich verwende allerdings irgentwie ungern ein do-while Schleife, geht das auch ohne?</p>
<p>PS:Danke für das Lob!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985206</guid><dc:creator><![CDATA[Chillee]]></dc:creator><pubDate>Wed, 24 Nov 2010 15:39:01 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 15:41:21 GMT]]></title><description><![CDATA[<p>Chillee schrieb:</p>
<blockquote>
<p>Ich verwende allerdings irgentwie ungern ein do-while Schleife, geht das auch ohne?</p>
</blockquote>
<p>Na, klar! Darf ich dazu goto verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985210</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985210</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 24 Nov 2010 15:41:21 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 16:39:42 GMT]]></title><description><![CDATA[<p>Chillee schrieb:</p>
<blockquote>
<p>Ich verwende allerdings irgentwie ungern ein do-while Schleife, geht das auch ohne?</p>
</blockquote>
<p>Sauber? Eher weniger, wenn der Code mindestens einmal aufgerufen werden soll, und nicht unnötige Tempvariablen etc. verwendet werden...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985247</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985247</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 24 Nov 2010 16:39:42 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 19:16:36 GMT]]></title><description><![CDATA[<p>Oh sorry, hab grad an was total anderes gedacht als das geschrieben habe. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Klar ein do-while schleife ist durchaus legitim ;)...bastel grad noch dran <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> !</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985328</guid><dc:creator><![CDATA[Chillee]]></dc:creator><pubDate>Wed, 24 Nov 2010 19:16:36 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 20:39:22 GMT]]></title><description><![CDATA[<p>So denke habe die Lösung nun zusammen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> !<br />
Wenn noch jemand Schwachstellen sieht, bitte bis spätestens Freitag posten...Danke!</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

// ------- Nebenfunktionen-------

// &gt;Eingabe
int eingabe (void) {
  int x = 0;
  std::cout&lt;&lt;&quot;Bitte geben sie eine natuerliche Zahl ein: &quot;;
  std::cin&gt;&gt;x;
  while (x&lt;1) {
    std::cout&lt;&lt;&quot;\nDie eingegebene Zahl ist nicht natuerlich!\nBitte geben sie erneut eine natuerliche Zahl ein: &quot;;
    std::cin&gt;&gt;x;
  }
  return x;
}

// &gt;Test ob Primzahl
bool primtest (int p) {
  int zaehler;

  if (p == 2) return 1;

  if (p %2 == 0) return 0;

  for (zaehler = 3; zaehler * zaehler &lt;= p; zaehler = zaehler+2) {
    if (p % zaehler == 0) return 0;
  }

  return 1;
}

// &gt;Primzahlzerlegung
int primzer (int y) {

   int i = 2;

  while (y &gt; 1) {
        while ((y%i != 0) || (primtest(i) == 0)) {
         i = i + 1;
    }
    std::cout&lt;&lt;i&lt;&lt;&quot; &quot;;
    y = y/i;
  }
  return 0;
}

// ------ Hauptfunktion -----------

int main () {
  int n;
  int k;

  std::cout&lt;&lt;&quot;Primfaktorzerlegung einer natuerlichen Zahl\n -------------------------\n &quot;&lt;&lt;std::endl;

  n = eingabe();
  if (n == 1) std::cout&lt;&lt;&quot;\nDie eingegebene Zahl laesst sich nur durch 1 teilen!&quot;&lt;&lt;std::endl;
  else {
    k = primtest(n);
    if (k == 0) {
      std::cout&lt;&lt;&quot;\nDie Zahl &quot;&lt;&lt;n&lt;&lt;&quot; laesst sich in folgende Primfaktoren zerlegen: &quot;&lt;&lt;std::endl;
      primzer (n);
      std::cout&lt;&lt;std::endl;
    }
    else {
      std::cout&lt;&lt;&quot;\n&quot;&lt;&lt;n&lt;&lt;&quot; ist eine Primzahl \nSie ist nur durch: &quot;&lt;&lt;n&lt;&lt;&quot; und 1 teilbar.&quot;&lt;&lt;std::endl;
    }
    }

  return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1985371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985371</guid><dc:creator><![CDATA[Chillee]]></dc:creator><pubDate>Wed, 24 Nov 2010 20:39:22 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 21:53:44 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Doch, ich fürchte, die Bedingung ist völlig ohne Grund. Sowohl bei trial division als auch beim Sieb des Eratosthenes ist ein Vortest auf Primalität der Teiler Zeitverschwendung.</p>
</blockquote>
<p>OK, da hast Du recht. Hatte nicht bedacht, dass bei der hier gezeigten Methode der Rest durch die gefundenen Primfaktoren schnell kleiner wird und man dadurch nur einen Bruchteil des E. Siebes bräuchte. Eine Ausnahme allerdings: Die Eingabezahl ist selbst eine sehr große Primzahl, da ist das Sieb dann schneller (aber nur da <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ...).</p>
<p>Man bräuchte so eine Art &quot;dynamisches Sieb&quot;, das immer nur bis zur nächsten gefundenen Primzahl weitermacht (wobei, denke ich, der Verwaltungsaufwand das Projekt sprengen würde.).</p>
<p>Übrigens habe ich hier<br />
<a href="http://www.hsg-kl.de/faecher/inf/algorithmus/standard/primfak/index.php" rel="nofollow">http://www.hsg-kl.de/faecher/inf/algorithmus/standard/primfak/index.php</a><br />
einen ganz netten Algorithmus gefunden, der nach ersten Schätzungen bis etwa 600x schneller werden kann als der von Euch entwickelte - je nach Eingabezahl und vor allem bei sehr großen Primfaktoren (z.B. bei n = 532895). Bei vielen kleinen Faktoren schwindet dieser Vorsprung.</p>
<p>Allerdings - er erfüllt die Bedingung der zwei getrennten Funktionen leider auch nicht. Und keine Ahnung, <em>warum</em> er funktioniert... Für Interessierte hier mal eine C-Version:</p>
<pre><code class="language-cpp">void primfaktoren( int n )
{
    while( n % 2 == 0 )
    {
    	cout &lt;&lt; &quot;2&quot; &lt;&lt; endl;
        n = n / 2;
    }
    while( n % 3 == 0 )
    {
    	cout &lt;&lt; &quot;3&quot; &lt;&lt; endl;
        n = n / 3;
    }

    int t = 5;
    int diff = 2;

    while( t*t &lt;= n )
    {
        while( n % t == 0 )
        {
            cout &lt;&lt; t &lt;&lt; endl;
            n = n / t;
        }

        t = t + diff;
        diff = 6 - diff;
    }

    if( n &gt; 1 )
    {
    	cout &lt;&lt; n &lt;&lt; endl;
    }
}
</code></pre>
<p>Viel Spaß noch weiterhin!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985403</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Wed, 24 Nov 2010 21:53:44 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 21:59:08 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Und keine Ahnung, <em>warum</em> er funktioniert...</p>
</blockquote>
<p>Wo haperts denn? Am t? t iteriert durch Primzahlkandidaten nach der simplen Analyse aus dem Link. Die Zeile mit der 6 ist ein Trick, um den Summanden zwischen 2 und 4 zu alternieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985405</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Wed, 24 Nov 2010 21:59:08 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 22:11:07 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Übrigens habe ich hier<br />
<a href="http://www.hsg-kl.de/faecher/inf/algorithmus/standard/primfak/index.php" rel="nofollow">http://www.hsg-kl.de/faecher/inf/algorithmus/standard/primfak/index.php</a><br />
einen ganz netten Algorithmus gefunden, der nach ersten Schätzungen bis etwa 600x schneller werden kann als der von Euch entwickelte</p>
</blockquote>
<p>Allerdings nur 33% schneller als die Version vom 23 Nov 2010 22:33</p>
<p>minastaros schrieb:</p>
<blockquote>
<p>Allerdings - er erfüllt die Bedingung der zwei getrennten Funktionen leider auch nicht.</p>
</blockquote>
<p>Das dürfte auch die entscheidende Bremse gewesen sein.<br />
Aber der Prof verlangt es eben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985409</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 24 Nov 2010 22:11:07 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 22:18:23 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wo haperts denn? Am t?</p>
</blockquote>
<p>Nee, an der späten Zeit, war schon zu müde zum Denken... Lag grad schon im Bett, da ist es mir auch aufgegangen, was es mit der 6 auf sich hat.</p>
<p>Allerdings glaube ich, dass bei großen Primfaktoren die immense Ersparnis durch das <code>t*t</code> in der while-Schleife kommt: Er bricht früh genug ab, während sich anderen Algorithmen bis zum Ende durchquälen, obwohl kein weiterer Faktor mehr gefunden werden kann.</p>
<p>Gute Nacht also.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985412</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Wed, 24 Nov 2010 22:18:23 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 22:24:59 GMT]]></title><description><![CDATA[<p>Chillee schrieb:</p>
<blockquote>
<p>Wenn noch jemand Schwachstellen sieht, bitte bis spätestens Freitag posten...Danke!</p>
</blockquote>
<p>Sieht gut aus! Die Ausgabe ist (verglichen mit meiner Version) höchstwahrscheinlich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> korrekt.<br />
Kleinste Mängel: 1 wird als Primzahl gewertet, du testest zwar, ob die Zahl 1 ist, in der entsprechenden Funktion würde es aber auch nicht fehl am Platze sein.<br />
Außerdem versuch mal 9876543210 als n einzulesen. Abhilfe schafft hier ein <code>cin.clear()</code> .<br />
Ansonsten top <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    />.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985415</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Wed, 24 Nov 2010 22:24:59 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Wed, 24 Nov 2010 22:25:37 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Allerdings glaube ich, dass bei großen Primfaktoren die immense Ersparnis durch das <code>t*t</code> in der while-Schleife kommt</p>
</blockquote>
<p>Ah, stimmt. Wir hatten zwar auch den Trick entdeckt und zaehler * zaehler &lt;= p gemacht, aber nur in der Primzahl-Feststellung, nicht in der Primfaktoren-Zerlegung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985416</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 24 Nov 2010 22:25:37 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Thu, 25 Nov 2010 08:26:41 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Ah, stimmt. Wir hatten zwar auch den Trick entdeckt und zaehler * zaehler &lt;= p gemacht, aber nur in der Primzahl-Feststellung, nicht in der Primfaktoren-Zerlegung.</p>
</blockquote>
<p>Naja, probiert mal, das <code>i * i</code> bei Euch in die While-Schleife reinzupacken. Dann habt Ihr der Vorteil da auch.<br />
Macht doch mal ein paar Zeitmessungen (timeval-Struktur aus time.h) rein und lasst einmal primzer1( ) und einmal primzer2( ) laufen. Würde mich interessieren, wie die Unterschiede sind.<br />
Hab das mit Eurem, dem oben genannten Algorithmus und dem guten Eratosthenes gestern mal gemacht. Das Sieb hat dabei fürchterlich abgekackt... - es sei denn, man hat ihm eine große Primzahl gegeben... Nicht wirklich effizient... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ein Tip noch: <code>\n</code> und <code>endl</code> gemischt sieht bei Printausgaben immer etwas unordentlich aus, weil sie ja (fast) das gleiche machen. Schreibt besser jede Zeile einzeln und immer ein <code>endl</code> dahinter. Sonst weiter so!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985463</guid><dc:creator><![CDATA[minastaros]]></dc:creator><pubDate>Thu, 25 Nov 2010 08:26:41 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Thu, 25 Nov 2010 12:33:36 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Schreibt besser jede Zeile einzeln und immer ein <code>endl</code> dahinter. Sonst weiter so!</p>
</blockquote>
<p>Aber '\n' ist besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985568</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 25 Nov 2010 12:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Thu, 25 Nov 2010 13:04:39 GMT]]></title><description><![CDATA[<p>minastaros schrieb:</p>
<blockquote>
<p>Macht doch mal ein paar Zeitmessungen (timeval-Struktur aus time.h) rein und lasst einmal primzer1( ) und einmal primzer2( ) laufen. Würde mich interessieren, wie die Unterschiede sind.</p>
</blockquote>
<p>Ok. Aber bei den riesigen Laufzeiten kann ich auch einfach die von Code::Blocks angezeigte Gesamtlaufzeit nehmen.</p>
<p>main:</p>
<pre><code class="language-cpp">for(int i=1000000000;i&lt;1000000000+10;++i){
		std::cout&lt;&lt;i&lt;&lt;&quot;: &quot;;
		primzer(i);
		std::cout&lt;&lt;'\n';
	}
</code></pre>
<p>Meßcode:</p>
<pre><code class="language-cpp">int primzer (int y) {

	int i = 2;

	while (y &gt; 1) {
		while ((y%i != 0) || (primtest(i) == 0)) {
			i = i + 1;
		}
		std::cout&lt;&lt;i&lt;&lt;&quot; &quot;;
		y = y/i;
	}
	return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>1000000000: 2 2 2 2 2 2 2 2 2 5 5 5 5 5 5 5 5 5
1000000001: 7 11 13 19 52579
1000000002: 2 3 43 983 3943
1000000003: 23 307 141623
1000000004: 2 2 41 41 148721
1000000005: 3 5 66666667
1000000006: 2 500000003
1000000007: 1000000007
1000000008: 2 2 2 3 3 7 109 109 167
1000000009: 1000000009

Process returned 0 (0x0)   execution time : 73.796 s
</code></pre>
<p>Soweit, so langsam.</p>
<p>Jetzt die i*i-Beschleunigung (uih, häßlich reingequetscht):</p>
<pre><code class="language-cpp">int primzer (int y) {

	int i = 2;

	while (y &gt; i) {
		while ((y%i != 0) || (primtest(i) == 0)) {
			if(i*i&gt;y){
				std::cout&lt;&lt;y&lt;&lt;&quot; &quot;;
				return 0;
			}
			i = i + 1;
		}
		std::cout&lt;&lt;i&lt;&lt;&quot; &quot;;
		y = y/i;
	}
	return 0;
}
</code></pre>
<pre><code>Process returned 0 (0x0)   execution time : 0.015s
</code></pre>
<p>Um weiter einen Unterschied sehen zu können, ziehe ich die main-Schleife größer.</p>
<pre><code>41.046 s
</code></pre>
<p>Jetzt mit i*i-Beschleunigung und ohne primetest:</p>
<pre><code>36 s
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1985590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985590</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Thu, 25 Nov 2010 13:04:39 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Thu, 25 Nov 2010 14:01:42 GMT]]></title><description><![CDATA[<p>Nochmals vielen Dank für die zahlreichen Antworten.</p>
<p>Leider komm ich zwischendrinne manchmal nicht mehr mit, da mir wahrscheinlich der Hintergrund fehlt. Ich habe bloß verstanden das mein Programm bei großen Zahlen zu langsam ist oder? Wie mach ich das besser? Wäre cool wenn mir das jemand auch erklären könnte, da ich sonst wieder bloß Bahnhof verstehe <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> !</p>
<p>@ Vicious Falcon: Danke! Aber was meinst du mit: &quot;die 1 wird als Primzahl gewertet&quot; . Ich nehm den Fall der 1 doch in der main vorher raus durch eine IF-Schleife. Ja und das mit &quot;9876543210&quot; hab ich schon festgestellt, da kommt er wie in eine Endlosschleife. Aber Warum? Und wie, wo und warum kann ich das mit einem cin.clear() beheben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985620</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985620</guid><dc:creator><![CDATA[Chillee]]></dc:creator><pubDate>Thu, 25 Nov 2010 14:01:42 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Thu, 25 Nov 2010 14:46:17 GMT]]></title><description><![CDATA[<p>Ich hatte ja geschrieben, dass es nur eine Kleinigkeit ist, in einer allgemein gültigen Funktion sollte aber auch der Fall n==1 betrachtet werden.</p>
<pre><code class="language-cpp">if (p==1 || p%2 == 0) return false;
</code></pre>
<p>Bei dem Einlesen kannst du überprüfen, ob alles geklappt hat</p>
<pre><code class="language-cpp">#include &lt;limits&gt;
int eingabe () {
	int x = 0;
	std::cout&lt;&lt;&quot;Bitte geben sie eine natuerliche Zahl ein: &quot;;
	while (!(std::cin&gt;&gt;x) || x&lt;1) // irgendwas ging schief
	{
		std::cout&lt;&lt;&quot;\nDie eingegebene Zahl ist nicht natuerlich!\nBitte geben sie erneut eine natuerliche Zahl ein: &quot;;
		if(cin.fail()) // Input konnte nicht konvertiert werden
		{
			std::cin.clear(); // Failbit löschen
			std::cin.ignore(std::numeric_limits&lt;streamsize&gt;::max(),'\n'); // den Rest der Zeile ignorieren und nochmal probieren
		}
	}
	return x;
}
</code></pre>
<p>Eine Eingabe von 4561gfrg ist immer noch gültig, es wird bis zum Auffinden von 'g' konvertiert und somit 4561 zurück gegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985651</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985651</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Thu, 25 Nov 2010 14:46:17 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Thu, 25 Nov 2010 18:53:51 GMT]]></title><description><![CDATA[<p>Okay danke, aber die Zeile</p>
<pre><code class="language-cpp">std::cin.ignore(std::numeric_limits&lt;streamsize&gt;::max(),'\n');
</code></pre>
<p>verstehe ich noch nicht bzw. was sagt diese aus? löscht sie einfach nur die Buchstaben von der Beispieleingabe?</p>
<p>Und dann zu</p>
<pre><code class="language-cpp">while (!(std::cin&gt;&gt;x) || x&lt;1)
</code></pre>
<p>Diese Schreibweise kenne ich noch nicht, aber ich interpretiere mal so:<br />
Auf Grund des Ausrufezeichens wird noch einer Eingabe gefragt und diese wird auch kleiner 1 getestet oder?<br />
Aber wenn ich nun das Beispiel eingebe &quot;4561gfrg&quot; was für einen Wert hat dies dann? Ich mein würde er dann auch in die Schleife gehen?<br />
Weil meines Anfängerwissen haben Buchstaben letzten Endes auch bloß Zahlwerte und diese wären ja dann größer 1 oder?</p>
<p>Sorry für die vielen Fragen aber lerne es erst seit 1,5 Monaten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985803</guid><dc:creator><![CDATA[Chillee]]></dc:creator><pubDate>Thu, 25 Nov 2010 18:53:51 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Thu, 25 Nov 2010 20:00:01 GMT]]></title><description><![CDATA[<p>Ich bin mir nicht sicher, ob ihr das überhaupt abfragen müsst, oder einfach von gültigen Eingaben ausgehen könnt.<br />
Trotzdem eine kurze Erklärung. Wenn cin eine Eingabe nicht konvertieren kann, wird das &quot;Failbit&quot; gesetzt. Die Eingabe verbleibt dabei aber im stream. Jede weitere Eingabe wird ignoriert, bis dieses &quot;Failbit&quot; gelöscht wurde.<br />
Das heißt, die Vorgehensweise ist Folgende:</p>
<ul>
<li>Zahl einlesen.</li>
<li>Überprüfen, ob der Eingabestream gültig ist.</li>
<li>Wenn nicht, mit cin.clear() das &quot;Failbit&quot; löschen, mit cin.ignore(..) die Eingabe verwerfen und es erneut probieren.</li>
</ul>
<p>Der <a href="http://www.cplusplus.com/reference/iostream/istream/ignore/" rel="nofollow">Aufruf</a></p>
<pre><code class="language-cpp">std::cin.ignore(std::numeric_limits&lt;streamsize&gt;::max(),'\n');
</code></pre>
<p>löscht alles, bis der <code>delim</code> , in diesem Fall '\n', gefunden wurde.</p>
<pre><code class="language-cpp">std::numeric_limits&lt;streamsize&gt;::max()
</code></pre>
<p>liefert den größtmöglichen Wert für den typedef streamsize.<br />
Die Bedingung</p>
<pre><code class="language-cpp">while (!(std::cin&gt;&gt;x) || x&lt;1)
</code></pre>
<p>bedeutet nichts weiter, als dass abgefragt werden soll, ob der Stream (cin) in einem fehlerhaften Zustand, ODER ob x&lt;1 ist. Nur wenn eine dieser beiden Bedingungen erfüllt ist, wird der Schleifenkörper betreten, ansonsten ist alles glatt gegangen und die Funktion gibt den eingelesenen Wert zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985836</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Thu, 25 Nov 2010 20:00:01 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Fri, 26 Nov 2010 07:59:11 GMT]]></title><description><![CDATA[<p>Okay das macht Sinn dankeschön!</p>
<p>Aber muss dann vor deiner ersten While-Schleife nicht noch ein</p>
<pre><code class="language-cpp">std::cin&gt;&gt;x;
</code></pre>
<p>stehen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1985963</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1985963</guid><dc:creator><![CDATA[Chillee]]></dc:creator><pubDate>Fri, 26 Nov 2010 07:59:11 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblemchen mit recht schwieriger Aufgabe on Fri, 26 Nov 2010 09:41:56 GMT]]></title><description><![CDATA[<p>Zuerst: ! negiert den Ausdruck <code>!true -&gt; false, !false -&gt; true</code> .</p>
<p>Chillee schrieb:</p>
<blockquote>
<p>Aber muss dann vor deiner ersten While-Schleife nicht noch ein</p>
<pre><code class="language-cpp">std::cin&gt;&gt;x;
</code></pre>
<p>stehen?</p>
</blockquote>
<p>Nein, der Ablauf ist ja Folgender:</p>
<ul>
<li><code>std::cin&gt;&gt;x</code> , Einlesen in x</li>
<li>überprüfen, ob der Stream in einem konsistenten Zustand ist</li>
<li>wenn ja, dann ist der Audruck <code>!(std::cin&gt;&gt;x)</code> ja <code>!(true)</code> und es wird ausgewertet ob x kleiner 1 ist.</li>
<li>wenn nein, ( <code>!(false)</code> ) wird <code>x&lt;1</code> nicht ausgewertet und der Schleifenkörper betreten, da bei dem logischen Oder || die Bedingung sowieso erfüllt ist.</li>
</ul>
]]></description><link>https://www.c-plusplus.net/forum/post/1986000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1986000</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Fri, 26 Nov 2010 09:41:56 GMT</pubDate></item></channel></rss>