0

出于某种原因,当我运行此代码时,当 for 循环中 i 的值为 7654319 时出现段错误。但奇怪的是,当我不检查该值是否为泛数字时,它可以正常工作没有段错误。当我检查它是否只是泛数字时,它也可以工作;但不适合两者。我使用 gdb 单步执行代码,这是我得到的输出:

Program received signal SIGSEGV, Segmentation fault.
0x00000000004007d3 in main () at Pand.cc:81
81      if (isPandigital(i) && Primes[i])
6: Primes[i] = <error: Cannot access memory at address 0x7ffefffffff4>
5: i = <error: Cannot access memory at address 0x7ffefffffff4>
4: Primes[7654317] = <error: Cannot access memory at address 0x7ffefffffff8>
3: Primes[7654321] = <error: Cannot access memory at address 0x7ffefffffff8>
2: Primes[7654319] = <error: Cannot access memory at address 0x7ffefffffff8>
1: Primes = <error: Cannot access memory at address 0x7ffefffffff8>

从输出来看,似乎通过在isPandigital(int)函数中操纵 i 的值,这也会影响 main 中 i 的值。这对我来说没有任何意义,但我继续使用不同的变量来表示isPandigital(int)函数中的 i,但我仍然得到同样的错误。

有人能帮助我吗?这类错误非常烦人,因为一切似乎都应该正常工作,但事实并非如此,解决方案只是将自己隐藏在实施层之下。任何帮助表示赞赏!

#include <cstdio>
#define MAX 7700000

typedef unsigned int uint;

bool* GetPrimes()
{  
  const int Need = MAX;
  bool* Sieve = new bool[Need];

  for (int s = 0; s < Need; ++s)
    Sieve[s] = 1;

  bool Done = false;
  uint w = 3;

  while (!Done)
  {  
    for (uint q = 3, Prod = w * q; Prod < (uint)Need ; q += 2, Prod = w * q)
      Sieve[Prod] = false;

    Done = (w > (Need >> 1) ? true : false);

    w+=2;
  }
  return Sieve;
}

bool isPandigital(int num)
{
  int arr [] = {1,2,3,4,5,6,7}, G, count = 7;
  do
  {
    G = num%10;
    if (arr[G-1])
      --count;
    arr[G-1] = 0;
  } while (num/=10);

  return (!count);
}

int main()
{  
  bool* Prime = GetPrimes();
  int i;

  for (i = 7654321 ;i > 2; i-=2)
  {
    if (Prime[i] && isPandigital(i))
      break;
  }

  printf("%d\n", i); 

  return 0;
}
4

2 回答 2

3

在你的isPandigital功能中。请注意,如果num是 10 的倍数或等于8or 9mod 10,您将遇到一些问题。越界数组访问通常会导致段错误。

发生这种情况的第一个素数是 19(如果从 7654321 倒退,则为 7654319):

bool isPandigital(int num)//num is (76543)19
{
  int arr [] = {1,2,3,4,5,6,7}, G, count = 7;
  do
  {
    G = num%10;        //G is 9
    if (arr[G-1])      //G-1 is 8; G is only indexed from 0 to 6.
      --count;            
    arr[G-1] = 0;      //G-1 is 8; G is only indexed from 0 to 6.
  } while (num/=10);

  return (!count);
}

请注意,尽管解决方案中没有 8 或 9,但您测试的任何素数都可能。

于 2013-03-27T04:12:30.057 回答
1

看着:

 G = num%10;
    if (arr[G-1])

那么,如果G是零呢?这也会破坏你的堆栈,使调试变得困难。

从表面isPandigital上看,在传递的数字是泛数字的情况下工作得很好,否则有一个数组绑定在/溢出?

于 2013-03-27T04:11:11.673 回答