2015-12-10 49 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/