ฉันกำลังเขียนเครื่องกำเนิดจำนวนเฉพาะโดยใช้ตะแกรงเอราทอสเทนีส ฉันทำให้มันทำงานในการสร้างจำนวนเฉพาะที่ต่ำกว่า 521102 ได้ แต่ตัวเลขที่สูงกว่านี้จะทำให้โปรแกรมหยุดทำงาน นี่คือรหัสของฉัน
#include <iostream>
using namespace std;
int main ()
{
int long MAX_NUM = 1000000;
int long MAX_NUM_ARRAY = MAX_NUM+1;
int Num_Array [MAX_NUM_ARRAY];
std::fill_n(Num_Array, MAX_NUM_ARRAY, 3);
int long sieve_prime = 2;
int long sieve_prime_constant = 0;
Num_Array [0] = 1;
Num_Array [1] = 1;
while (sieve_prime_constant <= MAX_NUM_ARRAY)
{
if (Num_Array [sieve_prime_constant] == 1)
{
sieve_prime_constant++;
}
else
{
Num_Array [sieve_prime_constant] = 0;
sieve_prime=sieve_prime_constant;
while (sieve_prime<=MAX_NUM_ARRAY - sieve_prime_constant)
{
sieve_prime = sieve_prime + sieve_prime_constant;
Num_Array [sieve_prime] = 1;
}
if (sieve_prime_constant <= MAX_NUM_ARRAY)
{
sieve_prime_constant++;
sieve_prime = sieve_prime_constant;
}
}
}
return 0;
}
ฉันใส่ MAX_NUM เป็น 1000000 และมันใช้งานไม่ได้ แต่อย่างที่ฉันบอกไปก่อนหน้านี้ ตัวเลขที่ต่ำกว่า 521102 ก็ใช้ได้ ฉันต้องสามารถทดสอบตัวเลขที่สูงขึ้นได้ ปัญหาของฉันคืออะไร และฉันจะแก้ไขได้อย่างไร
ขอบคุณมาก!
ขอบคุณสำหรับการตอบรับ ฉันลองวิธีแก้ปัญหาการจัดสรรอาเรย์แบบไดนามิก มันทำงานได้ดีในระดับหนึ่ง หลังจากตั้งค่า MAX_NUM เป็นประมาณ 500 ล้าน ฉันได้รับข้อผิดพลาดนี้เมื่อฉันเรียกใช้โปรแกรม...
ยุติการเรียกหลังจากโยนอินสแตนซ์ของ 'std::bad_alloc' what(): std::bad_alloc
แอปพลิเคชันนี้ได้ขอให้ Runtime ยุติการทำงานด้วยวิธีที่ผิดปกติ โปรดติดต่อทีมสนับสนุนของแอปพลิเคชันเพื่อขอข้อมูลเพิ่มเติม
มีหลังคา 500 ล้านก็ใกล้จะรับได้ แต่สูงกว่านี้จะดีกว่าไหม? มีความคิดอื่นอีกไหม?
long
- person Pete Becker   schedule 10.02.2013