# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > VB.NET >  پیدا کردن اعداد تام (اعداد کامل)

## maminb

سلام عزیزان.

یه برنامه نوشتم که اعداد کامل رو پیدا کنه.

اعداد کامل اعدادی هستند که وقتی مقسوم علیه هاشون رو با هم جمع کنی (به غیر از مقسوم علیه آخر که خود عدده)، برابر با خود عدد میشن. مثلا 6 یه عدد کامله:
*{1,2,3,6}*
*6=1+2+3*

این برنامه در تکست باکس اول به عدد میگیره و اعداد کامل رو تا اون عدد حساب میکنه.

ممنون میشم دانلود کنید و نظرتون رو بگید و راهنمایی کنید و بگید الگوریتم بهتری هست یا نه.

----------


## Computer.Programmer

سلام دوست من.
من الگوریتمتو نگا نکردم واسه اینکه کدهای زیاد دیگه ای اونجا بود بهتره شما الگوریتمی که مد نظرته رو بذاری تا کل پروژه چون اینجوری بچه ها باید کلی بگردن توی کدهای شما تا بفهمن این برنامه داره چی کار میکنه. البته گذاشتن کل برنامه از نظری خوبه چون اگه توضیحاتتون نامفهوم باشه اینجوری منظورتون بهتر درک میشه ولی بهتر اینه که علاوه بر پروژتون الگوریتم مدنظرتون رو هم بذارید تا نیازی به بررسی کا پروژه نباشه.

خوب بگذریم اینارو گفتم چون دوستون دارم و فکر کردم اینجوری زودتر به جوابتون می رسین :چشمک: 

من قطعه کدی رو نوشتم که اون کاری رو که میخوای انجام میده و فکر کنم سرعتش بیشتره. (با توجه به زمانی که پس از پایان عملیات تو برنامه خودت میده)

من برنامه شما رو با عدد 20000 تست کردم که برای محاسبه 99 ثانیه طول کشید ولی همین عدد در برنامه من حدودا 5 ثانیه طول کشید.

الگوریتم رو میزارم اگه سوالی داشتی بپرس.



 
 
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
PrivateFunction Cal(ByVal x AsDouble) AsBoolean
Dim b AsInteger = x
Dim r AsInteger = 0
Dim arr(-1) AsInteger
Me.Text = ""
For i = 1 To b
If i <> b Then
If (b 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 = b Then
ReturnTrue
Else
ReturnFalse
EndIf
EndFunction
 
 



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

----------


## maminb

دوست عزیز یه دنیا ممنونم که برنامم رو دانلود کردید و زحمت کشیدید و نظر دادید.

ممنون میشم راجع به الگوریتمتون یه توضیح کامل بدید! :گیج: 
آخه من اول دبیرستانم و.... :قهقهه: 

گذشته از شوخی ممنون میشم توضیحی کوتاه بدید.

----------


## Computer.Programmer

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


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

خوب بگذریم بریم سراغ الگوریتم:

توضیح ساب اول:


 
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 استفاده کردن) حالا توی این حلقه تمام خونه های آرایمون رو با هم جمع می  کنیم و در نهایت اگر جمع همه مقسوم علیه ها یا همان خانه های آرایه مون برابر با عدد ورودی به این معنی است که عدد ورودمون عددی است تام در نتیجه مقدار صحیح رو به روال فراخوان کرده میفرسته.

موفق باشی

----------


## maminb

عالی توضیح دادید! ممنون! :قلب:  :چشمک: 

آیا میتونم بگم یکی از دلایل کند شدن برنامم کار با تکست بود؟ یعنی باید از همون اول مثل شما با خود اعداد کار میکردم. درسته؟

----------


## Computer.Programmer

> آیا میتونم بگم یکی از دلایل کند شدن برنامم کار با تکست بود؟ یعنی باید از همون اول مثل شما با خود اعداد کار میکردم. درسته؟


خواهش می کنم قابلی نداشت  :چشمک: . اره همین موضوع خیلی سرعت رو می گیره علاوه بر این اگه اشتباه نکنم توی نگاه گذرایی که داشتم از Sleep هم استفاده کرده بودی که اینم خودش سرعت رو می گیره.

موفق باشی

----------


## Alghoochi

فکر کنم بشه این تابع رو به صورت بازگشتی نوشت. تو بازگشتی سرعتش باز هم بیشتر می شه

روش فکر کنید. من چون این مدت امتحان دارم نمی تونم روش کار کنم ولی بعد از امتحانم اگه یادم نره تابع بازگشتیشو می نویسم.

----------


## مینا1377

;using System


class Program
}
   () static void Main
 }
       ; int o = 0, d = 0
     ; ( " :Console.WriteLine("ADD RA VARED KONID
      ; ( )int m = int.Parse(Console.ReadLine
  (  ++ for (int i = 1; i <= m / 2; i
       }
           ; o = m % i
          (  if (o == 0
               ; d = i + d
      {
        (if (m == d
            ;("Console.WriteLine("add tam ast
        else
        ; ( " Console.WriteLine("add tam nist
       ;() Console.ReadKey
   {
{

این برنامه رو خودم نوشتم جواب داد

----------


## moghaderiyan

:بوس:  :تشویق:

----------

