2015-12-10 64 views
2

算法檢查兩個變量「a」和「x」是否是素數。如果是,它只是宣佈這些是素數。需要50個,當涉及到第6個位置程序顯示錯誤:堆棧溢出(參數:0x00000001,0x00442FF8)

堆棧溢出(參數:0x00000001,0x00442FF8)。

#include "stdafx.h" 
#include <iostream> 

using namespace std; 


int CheckIfPrime(long int n) 
{ 
    if (n<2) return 0; 
    for (int i = 2; i*i <= n; i++) 
     if (n%i == 0) return 0; 
    return 1; 
} 

int pow(int ap, int nt) 
{ 
    if (nt == 0) 
     return 1; 
    else 
     return ap *= pow(ap, --nt); 
} 

void CountA(int *aValue, int x) 
{ 
    *aValue = (pow(2, x) - 1); 
} 

int main() 
{ 
    int x = 1; 
    int a = 0; 
    int *aPointer = &a; 
    for (int i = 0; i <= 50;) 
    { 
     x++; 
     if (CheckIfPrime(x)) 
     { 
      CountA(aPointer, x); 
      if (CheckIfPrime(a)) 
      { 
       cout << i << ". X = " << x << " a = " << a << " are prime " << endl; 
        i++; 
      } 
     } 
     else 
     { 
      cout << ""; 
     } 
    } 
    getchar(); 
    return 0; 
} 
+0

我花了一些時間來實現:通過「堆棧溢出」你的意思是這個論壇,不是故障。如果你向'CountA'傳遞了一個負數'x',但你沒有,你的代碼會有堆棧溢出。除此之外,你的代碼是非常錯誤的,沒有比從頭開始重新設計更少的變化,可以使它工作在'x' – JSF

+0

的微小值上。這段代碼的要點是檢查x變量是否爲素數:如果爲真,那麼它計數a = 2^x -1。在算法之後檢查'a'是否爲素數。 –

+0

ConsoleApplication3.exe中的0x00D02509引發的異常:0xC00000FD:堆棧溢出(參數:0x00000001,0x002D2F5C)。 ConsoleApplication3.exe中的0x00D02509未處理的異常:0xC00000FD:堆棧溢出(參數:0x00000001,0x002D2F5C)。 這就是輸出 –

回答

0

你在函數棧溢出:

int pow(int ap, int nt) 
{ 
    if (nt == 0) 
    return 1; 
    else 
    return ap *= pow(ap, --nt); 
} 

非常大的NT將在遞歸進入太深造成如此

0

您正試圖計算的功率x準確的整數2對於一些相當大的值x。沒有普通的數據類型可以保存該值。但是如果你有一些數據類型保存這個值,那麼測試結果減1是否是這個簡單方法的主要部分將需要比宇宙的生命更多的時間。

你正在攻擊一個非常努力和很好研究的問題,只用天真的無知作爲工具。

https://primes.utm.edu/mersenne/