مرحبا..
كتبت اليوم برنامج لإيجاد الأعداد الأولية اللتي في مدى محدد وأردت عرضه فأي ملاحظة أو سؤال الرجاء وضعها هنا لكي نستفيد.
إعتمدت في الحل على قاعدة لإيجاد الأعداد الأولية تعرف بمرشحة اراتوستينس
تعتمد هذه المرشحة على شطب مضاعفات الأعداد بدءا من العدد 2
إليكم الحل اللي طلع معي
--------
البرنامج يحتوي على صندوقي نص و زر و قائمةlistbox و عنوان نصي label
صورة للبرنامج

ننشيء مصفوفة يكون حجمها هو القيمة الكبرى
إذا أردنا شطب عدد من القائمة فنجعل مقابله يساوي 2
مثلا العدد 6 سنشطبه ولذلك يكون
allNum[6]=2
int startValue=Int32.Parse(txtStart.Text);
int endValue=Int32.Parse(txtEnd.Text);
int count=0;
listBox1.Items.Clear();
if (startValue>endValue)
{
int temp=endValue;
endValue=startValue;
startValue=temp;
}
//إيجاد الجذر للعدد الأكبر
int EndValuesqrt=Convert.ToInt32(Math.Sqrt(endValue));
if(EndValuesqrt*EndValuesqrt>endValue)
EndValuesqrt--;
//ننشيء مصفوفة
byte [] allNum;
allNum=new byte[endValue+1];
allNum[0]=2;//صفر دائما ليس أولي
if(endValue>=1)
allNum[1]=2;
//لتحدديد أول عدد زوجي في المدى
//وإذا كان اقل من أو يساوي 2 نجعل أول عدد 4
int even=startValue;
if((startValue%2!=0)&&(startValue>2))
even=startValue+1;
else if(startValue<=2)
even=4;
// نشطب جميع الأعداد الزوجية الأكبر من 2 بداية من أول عدد زوجي في المدى
for(int i=even;i<=endValue;i+=2)
allNum=2;
//لشطب الأعداد الفردية
//بداية من 3 وحتى جذر العدد الأكبر
//تذكر أنه إذا لم يكن للعدد قاسم أقل من جذره فهو أولي
for(int i=3,js=0;i<=EndValuesqrt;i+=2)
{
// إذا لم يكن العدد مشطوبا يواصل
if (allNum!=2)
{
// لتحديد أول مضاعف للعدد أكبر من أو يساوي القيمة الابتدائية
if((startValue>i)&&(startValue%i!=0))
{
js=startValue-(startValue%i)+i;
js=(js==i)?js+i:js; }
else if(startValue<=i)
js=i+i;
else
js=startValue;
//يتم شطب مضاعفات العدد
for(int j=js;j<=endValue;j+=i)
allNum[j]=2;
}
}
for(int i=startValue;i<=endValue;i++)
if (allNum != 2)
{
listBox1.Items.Add(i);
count++;
}
label1.Text="يوجد في المدى المحدد " + count + " عددا أوليا";
من لديه طريقة أفضل من طريقة المصفوفات فليفيدنا بها.
الكود مرفق