出於某種原因,當我運行此代碼時,當for循環中的i的值爲7654319時,出現seg故障。但奇怪的是,當我沒有檢查if該值是泛數字,它在沒有段錯誤的情況下正常工作。當我檢查它是否僅僅是pandigital時它也有效;但不適用於兩者。我用gdb單步執行代碼,這裏是輸出我得到:不知道哪裏出現seg故障
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)
功能操縱我的價值,這也影響到主我的價值。這對我沒有任何意義,但是我繼續使用另一個變量來表示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;
}
你有沒有考慮調試? – Rapptz 2013-03-27 04:09:35
儘管它與你的段錯無關,但你應該注意到,在完成它之後你不會釋放內存。 – 2013-03-27 04:18:00
另外,你是否有任何機會在http://projecteuler.net/problem=41上工作? :) – 2013-03-27 04:18:29