الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

أوجد أكبر من هذا العدد الأولى ولك 100.000 دولاراً

بدأه ahmedsaoud31 في 3 فبراير 2012 · 4 رد · 1,554 مشاهدة · في لغة C و ++C
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاتة

أولاً ما هو العدد الأولى: هو العدد الذى لا يقبل القسمة الصحيحة إلا على نفسة وعلى الواحد الصحيح فقط ."أى لايوجد باقى من حاصل القسمة"

أمثلة على الأعداد الأولية : 2, 3, 5, 7, 11, 13, 17, 19

يقدم فريق GIMPS جائزة تقدر ب 100.000$ لمن يستطيع إيجاد رقم أولى يعطى بالمعادلة الآتية : prime = (2^p)-1 بحيث يتكون الرقم الأولى p من ثمانية خانات عشرية أو أكثر

وأيضاً تقدم تلك الشركة برامج تستطيع تنزيلها مجاناً والعمل عليها لإنتاج الأرقام الأولية

وإليك رابط موقع الفريق GIMPS :

http://www.mersenne.org/

وشرح المعادلة السابقة هى أن العدد الأولى المطلوب هو العدد 2 مرفوعاً لأس عدد أولى مطروحاً منه واحد وناتج هذه المعادلة يعطى عدد أولى.

فأكبر عدد أولى توصلوا له هو :

(2^43112609-1)

وإليك أن تتخيل الرقم الأولى الذى سيخرج من المعادلة السابقة

ما جعلنى أكتب هذا الموضوع هو سؤال طرح فى هذا المنتدى وهو برنامج لطباعة الأعداد الأولية وهذا هو كود البرنامج :

أولاً : الكود بلغة ++c

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{

int no,counter,counter1,check;
cout<<"<-----------------------PRIME NO. SERIES------------------------>";
cout<<"\n\n\n\t\t\t INPUT THE VALUE OF N: ";
cin>>no;
cout<<"\n\n THE PRIME NO. SERIES B/W 1 TO: \n\n"<<no;
for(counter = 1; counter <= no; counter++)
{
check = 0;
//THIS LOOP WILL CHECK A NO TO BE PRIME NO. OR NOT.
for(counter1 = counter-1; counter1 > 1 ; counter1--)
if(counter%counter1 == 0){
check++; // INCREMENT CHECK IF NO. IS NOT A PRIME NO.
break;
}
if(check == 0)
cout<<" \t"<<counter;
} getch();
return 0;
}

ثانياً : الكود بلغة C

 #include <stdio.h>

void main()
{
int no,counter,counter1,check;
printf("<-----------------------PRIME NO. SERIES------------------------>");
printf("\n\n\n\t\t\tINPUT THE VALUE OF N: ");
scanf("%d",&no);
printf("\n\nTHE PRIME NO. SERIES B/W 1 TO %d : \n\n",no);

for(counter = 1; counter <= no; counter++)
{
check = 0;
//THIS LOOP WILL CHECK A NO TO BE PRIME NO. OR NOT.

for(counter1 = counter-1; counter1 > 1 ; counter1--)
if(counter%counter1 == 0)
{
check++; // INCREMENT CHECK IF NO. IS NOT A PRIME NO.
break;
}
if(check == 0)
printf("%d\t",counter);
}
}

فإن إستخدمت هذا البرنامج فى موضوعنا السابق " ليس لإيجاد الرقم المطلوب" ولكن لإيجاد الرقم الذى سوف تضعة أس للرقم 2 أى لإيجاد ال p

فقط ضع للبرنامج قيمة مكونة من ثمانية أرقام أو أكبر أو تضع له قيمة ال p الموجودة فى أكبر رقم توصلوا له

فيلزمك هذا ترك جهازك يعمل قرابة السنة إذا كنت تمتلك جهاز يحتوى على معالج جيد.

لا تستعجل فقط أترك الجهاز فترة بعدها ستستطيع مشاهدة الأرقام الأولية على الشاشة ببطئ.

هذا فقط لإجاد ال p الذى ستضعه فى المعادلة لإيجاد الرقم الأولى المطلوب

فلهذا يجب علينا عند كتابة البرامج مراعاه عامل أساسياً من أهم عوامل نجاح أى برنامج ألا وهو عامل سرعة معالجة البيانات فى البرنامج

أترك لكم مجال التفكير فى كيفية تقليص زمن عمل البرنامج السابق

البرنامج السابق لإيجاد ال p من يريد ال 100.000$ يحاول عمل برنامج لفعل هذا :happy:

primeNumbers.c

primeNumbers.cpp

تم تعديل هذه المشاركة بواسطة ahmedsaoud31 في 4 فبراير 2012 في 12:36

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#2

عندي سؤال صح ما يتعلق بالموضوع اللي مكتوب

بس اتمني القي عندك اجابه

كود الاعداد الاوليه اللي مكتوب بلغة c++

انت يعني كتبته وفاهم له

او أخذته من موضوع

اذا كنت فاهم له اتمني تشرح عملية التتبع له

وأسفه علي مشاركتي الخارجه عن اطار الموضوع

#3

السلام عليكم ورحمة الله

أنا لم أكتب هذا الكود ولكن طرحته كمثال لأنه يستغرق وقت طويل فى إيجاد الأعداد الأولية الكبيرة

وأيضاً يقوم بطباعة الرقم 1 ضمن الأعداد الأولية وهو ليس من الأعداد الأولية

شرح المثال :

تم تعريف أربع متغيرات من نوع عدد صحيح وهم no لتخزين القيمة المدخلة من المستخدم counter وهو عداد الحلقة الخارجية counter1 وهو عداد الحلقة الداخلية و check لعرفة الأعداد الأولية

توجد لدينا حلقين for :

الأولى ذات العداد counter تبدأ العد من 1 حتى القيمة المدخلة من المستخدم no ويزداد العداد بمقدار الواحد فى كل دوران

الحلقة الثانية ذات العداد counter1 تبدأ العد من قيمة العداد counter مطروح منها 1 حتى أكبر من العدد 1 وينقص عداد تلك الحلقة بمقدار الواحد فى كل دوران

دائماً تصفر قيمة المتغير check فى كل دوران للحلقة الخارجية وتصبح قيمتة 1 فقط إذا تحقق شرط جملة if وإذا تحقق هذا الشرط يعنى أن قيمة العداد الخارجية counter الحالية ليست عدد أولى

وذلك لأنها قبلت القسمة الصحيحة على عدد أصغر منها خلاف الواحد الصحيح.

- بعد إنتهاء الحلقة الأولى يأتى شرط جملة if فإذا كانت قيمة المتغير check مساوية للصفر فيعنى هذا أن عداد الحلقة الخارجية counter فى تلك الدورة هو عدد أولى فيتم طباعتة وإذا كانت قيمتة تساوى 1

فيتم تجاهل طباعة قيمة العداد counter .

- ويعاود البرنامج تكرار الحلقة الخارجية ويقوم بتصفير قيمة المتغير check قبل الدخول على الحلقة الداخلية.

وبهذا تتم معالجة الأرقام الأولية فى البرنامج السابق.

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

#4

السلام عليكم

ابسط الامور لتحسين البرنامج هي معرفة الرياضيات والنظريات المتعلقة بالموضع وابسط هذه النظريات هي :

العدد الاولي هو عدد فردي اي يمكن تقليص ال For الى النصف فبدل اضافة 1 نضيف 2

ويكفي ايضا ان نقوم بالقسمة على الارقام التي اقل او تساوي جذر العدد لمعرفة العدد الاولي .

وايضا يمكن القسمة على الاعداد الاولية التي اقل من جذر العدد

مثال لمعرفة هل العدد 17 اولي ام لا , نأخذ الجذر له ونقرب لاصغر عدد صحيح حيث يكون الجذر 4 فيكفي ان نقسم على الاعداد التي اقل او تساوي 4 وهي 2 و 3 و 4 ويمكن تجاهل 4 اذا كنا نعرف الاعداد الاولية .

1
#5

السلام عليكم ورحمة الله

فعلاً أخ طارق إجابتك فى محلها :thumb_up: وهى إستخدام النظريات الرياضية المتعلقة بالأعداد الأولية فهى ستوفر وقت معالجة البرنامج بشكل كبير

1 - نجعل عداد الحلقة الخارجية يزداد بمقدار 2 لإثتثناء الأعداد الزوجية

وأيضاً لن نحتاج لإختبار الرقم أهو أولى أم لا إلا بقسمتة على الأعداد الفردية من 1 إلى جذر الرقم " طبعاً إذا كان الجذر عدد كسرى فسيتم تقريبة لأقرب عدد صحيح"

-- وهذا هو كود ++c :

#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;
int main()
{

int no,counter,counter1,check,sqrtnum;
cout<<"<-----------------------PRIME NO. SERIES------------------------>";
cout<<"\n\n\n\t\t\t INPUT THE VALUE OF N: ";
cin>>no;
cout<<"\n\n THE PRIME NO. SERIES B/W 1 TO "<<no;
cout<<"\n\n";
if(no>2)
cout<<2;
for(counter = 3; counter <= no; counter=counter+2)
{
check = 0;
sqrtnum= (int)sqrt(counter);
//THIS LOOP WILL CHECK A NO TO BE PRIME NO. OR NOT.
for(counter1 = 3; counter1 <=sqrtnum ; counter1=counter1+2)
if(counter%counter1 == 0){
check++; // INCREMENT CHECK IF NO. IS NOT A PRIME NO.
break;
}
if(check == 0)
cout<<" \t"<<counter;
} getch();
return 0;
}

-- وهذا كود c للبرنامج :

#include <stdio.h>
#include <math.h>
void main()
{
int no,counter,counter1,check,sqrtnum;
printf("<-----------------------PRIME NO. SERIES------------------------>");
printf("\n\n\n\t\t\tINPUT THE VALUE OF N: ");
scanf("%d",&no);
printf("\n\nTHE PRIME NO. SERIES B/W 1 TO %d : \n\n",no);
if(no>2)
printf("%d\t",2);
for(counter = 3; counter <= no; counter=counter+2)
{
check = 0;
//THIS LOOP WILL CHECK A NO TO BE PRIME NO. OR NOT.
sqrtnum= sqrt(counter);
for(counter1 = 3; counter1 <=sqrtnum ; counter1=counter1+2)
if(counter%counter1 == 0)
{
check++; // INCREMENT CHECK IF NO. IS NOT A PRIME NO.
break;
}
if(check == 0)
printf("%d\t",counter);
}
}

وفى الأكواد السابقة إستخدمنا القسمة على الأعداد الفردية تحت الجذر للرقم ويمكنكم عمل برنامج لتخزين الأعداد الأولية فقط تحت الجذر والقسمة عليها لتوفير مزيد من وقت تنفيذ البرنامج

دمتم بود ...

prime.cpp

prime.c

لاتحسبن العلم ينفع وحده مالم يتوج ربه بخلاق

لا إله إلا أنت سبحانك إني كنت من الظالمين

مواضيع مشابهة