نوشته شده توسط
a_mohammadi_m
در مورد مشكل اول :
قبل از اينكه يك عدد رو تجزيه كني كنترل كن كه خودش عدد اول نباشه ، اگه عدد اوله با يك پيغام به كاربر اطلاع بده و برنامه رو تموم كن
خود عدد 1 هم در همين چك كردن جزو اعداد اول محسوب ميشه يعني مي توني در اولين if اگر عدد گرفته شده 1 بود برنامه تموم كني
در ضمن مثل اينكه مثال بيان شده در پست شماره 2 كلا اشكال داشته باشه
در اين مثال همين كه يك عددي 2 تا مقسوم عليه داشت شروع به كارهاي ديگه اي مي كنه و بقيه اعداد رو چك نميكنه
ممنون از راهنماییتون دوست عزیز، اما عدد 1 اول نیست، بنابراین نباید به اعداد اول تجزیه بشه پس برنامه رو صحیح نوشته بودم، اما دلیل اینکه اون سوال رو پرسیده بودم این بودش که حین تست برنامه بیشتر روی تجزیه عدد تمرکز کرده بودم و نه اینکه تجزیه اون به عوامل اول که میشد خیلی راحت مسئله رو حل کرد،پس سوالم اشتباه بوده، بازم ممنون :)
در ضمن مثل اينكه مثال بيان شده در پست شماره 2 كلا اشكال داشته باشه
در اين مثال همين كه يك عددي 2 تا مقسوم عليه داشت شروع به كارهاي ديگه اي مي كنه و بقيه اعداد رو چك نميكنه
اگه مشکلی بوده تو کد اصلی بوده
نه دوست عزیز مشکلی تو کد اصلی نبود، تغییر اساسی که شما تو برنامه داده بودید این کد بود :
Else
Text1=a
جای نامناسبش باعث میشه شرط اولیه رو دیگه رعایت نکنه . اما خیلی ممنون بابت حذف علامت اضافه :)
فکر کنم دوستان برنامه رو مطالعه نکرده بودند، به این روش عمل کردم
1- عدد رو از کاربر میگیرم
2- عوامل اول رو تا اون عدد استخراج میکنم
3- بخش پذیری عدد رو نسبت به اعداد اول بدست اومده تا خوده اون عدد رو بررسی میکنم،
4- بعد از پیدا کردن اعداد اول دارای شرایط بالا، عدد رو تا وقتی که خارج قسمت تقسیم عدد به اعداد اول مرحله ی قبل ، صحیح باشه به عوامل اولش تجزیه میکنم
5- عوامل اولی که شامل حلقه بودن رو وارد خروجی میکنم به اضافه تعداد دفعاتی که عدد بر اون ها قابل تقسیم بوده ( به عنوان توان )
اینم کد نهایی بعد از اصلاح، تنها تغییرش حذف علامت توان اضافه بعد از رقم آخر هستش ( ممنون از دوست عزیز بابت کد )
text1 عدد رو از میگیره، text2 خروجی رو نشون میده و command1 هم عملیات رو .
Private Sub Command1_Click()
Text2.Text = ""
Dim i, j, s, a, f As Integer
If Text1.Text > 1 And Text1.Text <> "" Then
a = Fix(Text1.Text)
For i = 1 To a
s = 0
For j = 1 To i
If i Mod j = 0 Then
s = s + 1
End If
Next j
If s = 2 Then
f = 0
While ((a / i) = Int(a / i))
a = (a / i)
f = f + 1
Wend
If f <> 0 Then
Text2.Text = Text2.Text + Str(i) + "^" + Str(f) + Space(1) + "*" + Space(1)
End If
End If
Next i
Text2.Text = Left(Text2.Text, Len(Text2.Text) - 2)
End If
End Sub
که الگوریتم کلی همینه :
For i = 1 To a
s = 0
For j = 1 To i
If i Mod j = 0 Then
s = s + 1
End If
Next j
If s = 2 Then
f = 0
While ((a / i) = Int(a / i))
a = (a / i)
f = f + 1
Wend
If f <> 0 Then Print i & "^" & f
End If
Next i
و ممنون از جناب mahdi1373 بابت معرفی برنامشون :) روشی که استفاده کردید باعث شده برنامه شما خیلی سریعتر عمل کنه