PDA

View Full Version : پیدا کردن مقسوم علیه های اول یک عدد



*nvidia*
پنج شنبه 08 تیر 1391, 00:23 صبح
سلام دوستان

الگوریتم پیدا کردن مقسوم علیه های اول یک عدد رو می خواستم.

درخواست دیگه ای هم دارم:
اگر لیستی شامل چند عدد رندوم مثل زیر داشته باشیم:

2,3,41,33,51,57,109,471,1234,1231

چطور میشه اعداد اول رو از این لیست اعداد بیرون کشید(شناسایی کرد)


زبان هم ترجیحا سی شارپ

ممنون از راهنمایی شما

me.enik
دوشنبه 12 تیر 1391, 10:14 صبح
سلام.
روش کلی پیدا کردن مقسوم علیه های یک عدد :
از 1 تا خود اون عدد چک میری ( for ), هر دفعه هم که داری میری, یه بار شرط میزاری که اگر باقی مانده اون عدد خودت, بر این مساوی با 0 بود, پس این عدد مقسوم علیه اون هستش.
به طور کلی میشه گفت :
یه فور -> در هر بار اجرا, چک -> چک کردن اینکه باقی مانده صفر هست یا نه -> اگر صفر بود, پس مقسوم علیه هستش.
البته فکر کنم برای اینکه برنامه ات سریع تر بشود, میتونی از 1 تا نصف اون عدد بری, مثلا اگر میخوای مقسوم علیه های 10 را پیدا کنی, از 1 تا 5 بروی, کافی باشه, چون مطمئن هستیم که بعد از اون نصف اون عدد, دیگر هیچ مقسوم علیه ای وجود ندارد.

حالا وقتی اون عدد ها ( مقسوم علیه ها ) رو پیدا کردی, دوباره میای و روی هر کدوم از اونا چک میکنی که ببینی بیشتر از 2 تا مقسوم علیه دارند یا نه, اگر بیشتر بود که اول نیستند, اگر کمتر (!!) یا مساوی بود که عدد اول هستند.
البته این بار باید از 1 تا خود اون عدده بری تا بتونی بفهمی.

روش های دیگه ای هم وجود داره که تقریبا تمام روش ها مثل هم هستند و از یک جور قواعد کلی استفاده میکنند.
اگر خواستی, سورس جفت این برنامه ها رو دارم که میتونم برات بزارم, سورس ها به زبان ++c هستش که میتونم با پاسکال هم برات بنویسم تا ازشون استفاده کنی.

me.enik
دوشنبه 12 تیر 1391, 10:26 صبح
در مورد اون اعداد رندم هم دقیقا باید همون کار رو بکنی.
یعنی باید بیای و مثلا برای بار اول, عدد 41 را انتخاب کنی و بیای چک کنی ببینی که اول هستش یا نه.
و دفعه بعد یه عدد دیگه رو و ... .

برای چک کردن هم اون بالا گفتم, ولی بازم میگم تا بهتر متوجه بشی.

فکر کن ما الآن عدد 41 را میخواهیم ببینیم اول هستش یا نه.
میایم و یه فور ( for ) میزاریم از یک تا خود اون عدده, در هر بار اجرا شدن for هم, میام و چک میکنیم که آیا اون عدد, که الآن 41 هستش, بر اون عدد داخل for یخشپذیر هستش یا نه, یا مثلا باقی مانده اش مساوی با صفر هستش یا نه, حالا اگر شرط درست بود, مقدار یه متغییری رو به علاوه ی مقدار قبلی و بعد به علاوه ی 1 میکنیم, یعنی مثلا ::
توی پاسکال :
a=a+1
توی سی پلاس پلاس :
a+=1
توی سی شارپ :
بلد نیستم که !!

خب, پس میایم و این کار رو انجام میدیم, حالا وقتی که اون for تموم شد, یعنی بیرون از حلقه ی for, میایم و میبینیم که آیا اون عدده بزرگتر از 2 هستش, اگر بودش که عدده اول نیستش, اگر نبودش که عدده اول هستش.



راستی, قطعا روش های بهینه تری وجود داره که بتوان از اون ها استفاده کرد, ولی فکر کنم برای شما همین این روش ها کافی باشه.
و در حقیقت, باید روش های بهینه تر را, خودتون کشف کنید !! :d


تا حد امکان, سعی کردم توضیحات رو واضح بدم.
اگر جایی رو نفهمیدی, بگو بیشتر توضیح بدهم.

atefe70
سه شنبه 28 آذر 1391, 21:23 عصر
میشه بهم بگید چجور میتونم این کد رو درس کنم :

اخه برای بعضی اعداد درسته ولی برای عددی مثل 30 بجای که به من بگه 3تا مقسوم علیه اول داره . میگه 4 تا . !!!!!!!!

Dim x As Integer
Dim s As Integer
Dim r As Integer
Dim j As Integer
Dim i As Integer
s = 0
j = 2 'chon adad aval az 2 ast
x = InputBox("enter a number")

For i = 1 To x / 2
If (x Mod i = 0) Then
r = i Mod j
If r = 1 Then
s = s + 1
End If

End If
Next i