算法检查两个变量" a"和" x"是素数。如果是的话,它只是宣布这些是素数。需要50个,当谈到第6个位置的程序时显示错误:
在ConsoleApplication3.exe中的0x00D02509处抛出异常:0xC00000FD:堆栈溢出(参数:0x00000001,0x002D2F5C)。 ConsoleApplication3.exe中0x00D02509处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000001,0x002D2F5C)。
#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 :(得分:1)
功能中有堆栈溢出:
int pow(int ap, int nt)
{
if (nt == 0)
return 1;
else
return ap *= pow(ap, --nt);
}
对于非常大的nt,它会在递归中输入过深而导致SO
答案 1 :(得分:0)
您正在尝试为x
的一些相当大的值计算精确整数2到幂x
。没有普通的数据类型可以保存该值。但是如果你有一些数据类型保存该值,那么通过这种简单的方法测试结果减去一个是否为素数将比宇宙的生命花费更多的时间。
你正在攻击一个非常努力且研究得很好的问题,只使用天真的无知作为工具。