2017-02-24 2 views
-4

Ich versuche, einen Code zu schreiben, zeigt alle Zahlen mit den folgenden Merkmalen:mit Vektor als Funktionsausgabe

  • die Zahl selbst eine Primzahl ist.

  • für jede von rechts entfernte Ziffer sollte die verbleibende Zahl immer noch eine Primzahl sein.

In Anbetracht der Zahl 293 zum Beispiel: 293 selbst eine Primzahl ist, wenn wir die Ziffer auf der wir 29 rechts löschen, die noch eine Primzahl ist, und wenn wir die rechte Ziffer löschen wieder haben wir 2 die ist immer noch Prime.

Ich versuche, einen Code zu schreiben, der die Ganzzahl n < = 8 vom Benutzer erhält und alle n-stellige Zahlen mit den oben genannten Eigenschaften zeigt. Mein Algorithmus soll eine rekursive Funktion (show) schreiben, die den Vektor v zurückgibt.

Wenn n=1 es dann nur die Zahlen zeigt 2-3-5-7 ... wenn n!=1 es show(n-1) nennen sollte und multiplizieren alle generierten Zahlen von 10 und fügen Sie sie mit ungeraden Zahlen auf ... dann sollte es überprüfen wenn die neue Nummer prim ist. Wenn ja, sollte es zum Vektor hinzugefügt werden.

Mein Problem ist der Code funktioniert nur für n=1. Hier ist mein Code:

#include <iostream> 
#include <cmath> 
#include <vector> 
#include <algorithm> 
#include <iterator> 

using namespace std; 

bool isPrime(int a) 
{ 
    int i, p = 0; 
    if (a == 1) 
     return false; 
    else 
    { 
     for (i = a - 1; i > sqrt(a); i--) 
      if (a % i == 0) 
       p++; 
     if (p != 0) 
      return false; 
     else 
      return true; 
    } 
} 

vector<int> show(int n) 
{ 
    vector<int> v; 
    int i, j; 
    if (n == 1) 
    { 
     v.push_back(2); 
     v.push_back(3); 
     v.push_back(5); 
     v.push_back(7); 
    } 
    else 
    { 
     show(n - 1); 

     if (n != 1) 
      for (i = 0; i < v.size(); i++) 
      { 
       for (j = 1; j <= 9; j += 2) 
        if (isPrime((v.at(i) * 10) + j)) 
         v.at(i) = (v.at(i) * 10) + j; 
      } 
    } 
    return v; 
} 

int main() 
{ 
    int n, s = 0, i; 

    cin >> n; 
    show(n); 
    for (i = 0; i < show(n).size(); i++) 
     cout << show(n).at(i) << endl; 
    system("pause"); 
    return 0; 
} 
+3

Es klingt wie Sie müssen lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: ** [Wie kleine Programme zu debuggen] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Sie sollten wirklich den Rückgabewert von 'speichern show 'in' main' anstatt die Primes 'n + 2' mal zu berechnen. – mch

Antwort

0

Neben zu Frage, werfen Sie einen Blick auf die show(n - 1) Linie. Sollten Sie den Rückgabewert nicht speichern: v = show(n - 1)?

Auch wird es besser sein, den Vektor als Referenz übergeben, auf diese Weise vermeiden Sie die Kopie des Vektors Inhalt (in Ihrem Fall hat es nicht viel Einfluss, da Vektor nicht zu viel wachsen wird, aber vorstellen, mit große Werte für n).

Verwandte Themen