نوشته شده توسط
maminb
ممنون میشم راجع به الگوریتمتون یه توضیح کامل بدید!
خواهش می کنم. از عکستون معمول بود که چه سن و سالی هستین ولی دلیل نمیشه که بخواین توی زمینه برنامه نویسی خودتونو دست کم بگیرید.
خوب بگذریم بریم سراغ الگوریتم:
توضیح ساب اول:
PrivateSub StartSearch(ByVal len AsInteger)
Dim fd AsDate
fd = Now
Me.TextBox1.Text = ""
For i = 1 To len
If Cal(i) Then
Me.TextBox1.Text &= i & ", "
EndIf
Next
Me.Text = DateDiff(DateInterval.Second, fd, Now)
EndSub
این ساب یک آرگومان از نوع عددی را بع عنوان محدوده جستجو میگیره مثلاً عدد 2000 به معنی اینه که قرار جستجو بین 1 تا 2000 صورت بگیره.
متغیر fd از نوع تاریخ است و زمان شروع محاسبه رو در خودش نگه میداره یعنی همین الان.
fd = Now (زمان جاری را با تابع Now می گیریم)
این متغیر برای محاسبه زمان سپری شده استفاده میشود.
حلقه ای از عدد یک تا عدد نهایی ایجاد می کنیم. در این حلقه تابع Cal را صدا میزنیم و مقدار شمارنده حلقه را برای آن می فرستیم. این تابع برای ما مشخص میکند که آیا عدد ما عددی کامل هست یا خیر در صورتی که جواب درست بود عدد رو به تکس باکسمون اضافه می کنیم و در غیر اینصورت یعنی اگر عددتام نبود آن را در نظر نمی گیرد. و در نهایت پس از اتمام حلقه با تابع DateDiff اختلاف تاریخ ثبت شده در اول روال در متغییر fd را با تاریخ هم اکنون می سنجیم و نتیجه را نمایش می دهیم.
توضیح تابع Cal:
PrivateFunction Cal(ByVal x AsInteger) AsBoolean
Dim r AsInteger = 0
Dim arr(-1) AsInteger
Me.Text = ""
For i = 1 To x
If i <> x Then
If (x Mod i = 0) Then
ReDimPreserve arr(arr.Length)
arr(arr.Length - 1) = i
EndIf
EndIf
Next
ForEach i In arr
r += i
Next
If r = x Then
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction
کار کلی این تابع این است عددی را به عنوان ورودی دریافت کرده و می سنجد آیا عددتام است یا خیر که اگر عدد تام بود مقدار True را برمی گرداند.
نحوه محاسبه:
اول حلقه ای از 1 تا عدد ورودی ایجاد کرده و سپس درون حلقه می سنجیم که مقدار شمارندمون با مقدار عدد ورودی برابرنباشد که اگر این شرط برقرار بود برای اینکه مقسوم و علیه عدد رو بدست بیاریم با استفاده از Mod شرطی مینویسیم که در صورتی صحیح می شود که باقیمانده عدد ورودی تقسیم بر مقدار شمارنده برابر صفر باشد که در این صورت داخل شرط یک خونه به آرایه مون اضافه می کنیم و مقدار اون خونه رو برابر با عدد شمارنده که مقسوم علیه ای از عدد ورودی است قرار می دیم.
پس از اتمام حلقه اول دوباره حلقه ای به اندازه طول آرایه مون که مقسوم علیه های عدد ورودی هست ایجاد می کنیم (البته من برای راحتی وصد البته اصولی تر بودن از For each استفاده کردن) حالا توی این حلقه تمام خونه های آرایمون رو با هم جمع می کنیم و در نهایت اگر جمع همه مقسوم علیه ها یا همان خانه های آرایه مون برابر با عدد ورودی به این معنی است که عدد ورودمون عددی است تام در نتیجه مقدار صحیح رو به روال فراخوان کرده میفرسته.
موفق باشی