یکی نیست به این سوال یه جواب کامل بده ؟
دوست عزیز،
چند دلیل داشته که به این سئوال پاسخ داده نشده است. اگر تمام پست های من را نگاه کنید اکثر اونها به پاسخ به سئوال دوستان اختصاص داده شده، اجازه بدید یک دردودلی بکنم: طبق تجربه ای که دارم، متاسفانه دوستانی هر چند کم، یک اکانت توی سایت ایجاد میکنند، چند تا سئوال میکنند و دیگه حتی به سایت برای جواب اونها سر هم نمیزنند، در صورتیکه ممکنه برای جواب به سئوال اونها آدم کلی وقت گذاشته باشه، دیگه اینکه سئوالهاشون را توی جای نادرستی طرح میکنند و گاهی اوقات اصلاً آدم اونها را نمی بینه. تالار کامپیوتر بخشی به نام سئوالات و پرسشها داره که جای طرح سئوالات اونجاست. دیگه اینکه بعضی ها یک سئوال توی چندین جا طرح میکنند و این باعث میشه که پاسخ دهنده گیج شود و حتی وقتی توی یکجا جوابشون را میده اصلاً اون را نمی بینند! در آخر هم بد نیست که وقتی جواب سئوالشون دیدند از پاسخ دهنده یک تشکر خشک و خالی بکنند که نقش خسته نباشید را داشته باشد.
و اما در مورد الگوریتم:
این الگوریتم بسیار سئوال میشود و بسیاری موارد در درس ساختمان داده ها به آن اشاره میشود، این الگوریتم را جدا از حلقه به صورت Recursive پاسخ بهتری میدهد. (توابع بازگشتی)
برای نوشتن این الگوریتم میتوان از قضیه : عددی مانند m اول است اگر و تنها اگر m بر هیچ کدام از اعداد اول تابیشتر از جذر m بخشپذیر نباشد، استفاده کرد.
در الگوریتم Recursive برای تجزیه یک عدد به حاصلضرب عاملهای اول ، آن را به کوچکترین عدد اولی که بر آن بخشپذیر باشد تقسیم میکنیم و خارج قسمت را نیز بر کوچکترین عدد اولی که بر آن بخش پذیر باشد تقسیم میکنیم و این کار را تاجایی ادامه میدهیم که خارج قسمت یک باشد. در این صورت حاصلضرب مقسوم علیهها ، حاصلضرب عاملهای اول عدد مورد نظر خواهد بود.
چون توابع Recursive کمی پیچیده تر به نظر میآیند و توی سئوال نیز چنین چیزی خواسته نشده است، اینجا از الگوریتم معمولی استفاده میکنم ولی به یاد داشته باشید راه حل صحیحتر این مسئله استفاده از توابع بازگشتی است.
کد:
بخشی از برنامه اصلی که چاپ میکند
for (int i=2; i<=sqrt(n); i++)
if( is_prime(i) && (n%i)==0)
printf("%i",&i);
و تابع اینکه عدد اول هست یا خیر
int is_prime(int n)
{
int i;
for(i=2;i<=sqrt(n);i++){
if (n%i) continue;
else return 0;
}
return 1;
}
این الگوریتم ترکیبی از دو الگوریتم آیا عدد L اول هست یا خیر و الگوریتم اصلی است که البته میشود آنها را ادغام کرد.
الگوریتم چاپ مقسوم علیه های اول
1. عدد N را از ورودی بخوان
2. عدد صحیح جذر N را در B قرار میدهیم
3. L را برابر 1 قرار دهید.
4. به L یک واحد اضافه کنید.
5. اگر L عدد اول است و باقیمانده N بر L برابر صفر است L را در خروجی چاپ کن.
6. به L یک واحد اضافه کنید.
7. اگر L کوچکتر یا مساوی B بود به 4 برو.
8.پایان
الگوریتم اینکه عدد L اول هست یا خیر (چون از الگوریتم بازگشتی استفاده نمیکنیم، فقط کنترل می کنیم که عدد بر کلیه اعداد کوچکتر یا مساوی جذر خودش به غیر از یک، بخش پذیر نباشد):
1. مقدار صحیح جذر L را J قرار دهید.
2. I را برابر 2 قرار دهید.
3. اگر I کوچکتر یا مساوی J نبود برو به 7
4. اگر باقیمانده تقسیم L بر I صفر بود برو به 9
5. به I یکی اضافه کنید.
6. برو به 3
7. عدد L اول هست.
8. برو به 10
9. عدد L اول نیست.
10. پایان.
چون اینها را حفظی نوشتم ؛ممکنه اشتباهات کوچک و ناخواسته ای توشون باشه. ولی کلیاتش درسته، لطفاً در نهایت کنترلشان کنید.
پر انرژی باشید.