الگوریتم واسه مقسوم علیهای اول عدد n

kral_pontiiac

عضو جدید
الگوریتمی که مقسوم علیه های اول عدد ورودی n رو در خروجی چاپ کنه .
البته خیلی وقتها پیش سورسش رو نوشتم .
الان میخام الگوریتمش رو هم ببینم .
اگه یکی لطف کنه ممنون میشم !
 

E.lahe

عضو جدید
کاربر ممتاز
الگوریتمی که مقسوم علیه های اول عدد ورودی n رو در خروجی چاپ کنه .
البته خیلی وقتها پیش سورسش رو نوشتم .
الان میخام الگوریتمش رو هم ببینم .
اگه یکی لطف کنه ممنون میشم !
دوست عزیز من خودم تازه واردم تو مبحث برنامه نویسی .
به نظرم فقط باید تو این کار خلاقیت داشت .
شما مشتونید اول همه مقسوم علیه ها رو پیدا کنید و بعد از اونها ، اونهایی که اول هستند رو بفرستید خروجی.
البته این بهترین راه حل نیست . ولی من تا این حد بلدم فعلا که به شما هم گفتم !
 

E.lahe

عضو جدید
کاربر ممتاز
یکی نیست به این سوال یه جواب کامل بده ؟
 

fjalili

عضو جدید
یکی نیست به این سوال یه جواب کامل بده ؟

دوست عزیز،

چند دلیل داشته که به این سئوال پاسخ داده نشده است. اگر تمام پست های من را نگاه کنید اکثر اونها به پاسخ به سئوال دوستان اختصاص داده شده، اجازه بدید یک دردودلی بکنم: طبق تجربه ای که دارم، متاسفانه دوستانی هر چند کم، یک اکانت توی سایت ایجاد میکنند، چند تا سئوال میکنند و دیگه حتی به سایت برای جواب اونها سر هم نمیزنند، در صورتیکه ممکنه برای جواب به سئوال اونها آدم کلی وقت گذاشته باشه، دیگه اینکه سئوالهاشون را توی جای نادرستی طرح میکنند و گاهی اوقات اصلاً آدم اونها را نمی بینه. تالار کامپیوتر بخشی به نام سئوالات و پرسشها داره که جای طرح سئوالات اونجاست. دیگه اینکه بعضی ها یک سئوال توی چندین جا طرح میکنند و این باعث میشه که پاسخ دهنده گیج شود و حتی وقتی توی یکجا جوابشون را میده اصلاً اون را نمی بینند! در آخر هم بد نیست که وقتی جواب سئوالشون دیدند از پاسخ دهنده یک تشکر خشک و خالی بکنند که نقش خسته نباشید را داشته باشد.

و اما در مورد الگوریتم:

این الگوریتم بسیار سئوال میشود و بسیاری موارد در درس ساختمان داده ها به آن اشاره میشود، این الگوریتم را جدا از حلقه به صورت 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. پایان.

چون اینها را حفظی نوشتم ؛ممکنه اشتباهات کوچک و ناخواسته ای توشون باشه. ولی کلیاتش درسته، لطفاً در نهایت کنترلشان کنید.

پر انرژی باشید.
 
آخرین ویرایش:

E.lahe

عضو جدید
کاربر ممتاز
1. عدد N را از ورودی بخوان
2. عدد صحیح جذر N را در B قرار میدهیم
3. L را برابر 1 قرار دهید.
4. به L یک واحد اضافه کنید.
5. اگر L عدد اول است و باقیمانده N بر L برابر صفر است L را در خروجی چاپ کن.
6. به L یک واحد اضافه کنید.
7. اگر L کوچکتر یا مساوی B بود به 4 برو.
8.پایان

خیلی خیلی ممنونم
من فقط تو قسمت شماره 5 کمی مشکل داشتم . البته مشکل که چه عرض کنم . بی دقتی !!!
 

E.lahe

عضو جدید
کاربر ممتاز
ممنون !
حل شد با این الگوریتم شما
البته باید برم تریس کنم !
مرسی
 

Similar threads

بالا