2017-02-24 53 views
-4

我試圖寫的代碼顯示所有的數字具有以下特點:使用向量作爲功能輸出

  • 號碼本身是一個素數。

  • 對於從右邊移除的每個數字,剩下的數字仍然應該是質數。

考慮數293例如:293本身是一個素數,如果我們刪除我們有29右邊的數字仍然是一個素數,如果我們刪除右邊的數字再次,我們有2,仍然是素數。

我試圖編寫一個代碼,它從用戶那裏獲得整數n < = 8,並顯示具有上述特徵的所有n位數字。我的算法是編寫一個遞歸函數(show),它返回矢量v

如果n=1那麼它只是顯示的數字2-3-5-7 ......如果n!=1應該調用show(n-1)乘以10的所有生成的數字,並將它們添加了奇數......那麼就應該檢查如果新號碼是首要的。如果是這樣,它應該被添加到矢量。

我的問題是代碼只適用於n=1。這裏是我的代碼:

#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

這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

+0

你真的應該保存'在'main'中顯示'而不是計算素數'n + 2'次。 – mch

回答

0

除了對問題的意見,請看看show(n - 1)行。你不應該保存返回值:v = show(n - 1)

此外,將向量作爲參考傳遞會更好,這樣您可以避免向量內容的副本(在您的情況下,由於向量不會增長過多,所以不會產生太大影響,但可以設想使用n的值很大)。