نمایش نتایج 1 تا 9 از 9

نام تاپیک: پیدا کردن اعداد تام (اعداد کامل)

  1. #1
    کاربر دائمی آواتار maminb
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    Tehran
    پست
    132

    Post پیدا کردن اعداد تام (اعداد کامل)

    سلام عزیزان.

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

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

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

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

  2. #2
    کاربر دائمی
    تاریخ عضویت
    آبان 1388
    محل زندگی
    مشهد
    سن
    38
    پست
    164

    نقل قول: پیدا کردن اعداد تام (اعداد کامل)

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

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

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

    من برنامه شما رو با عدد 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





    نمونه برنامه رو هم میزارم
    فایل های ضمیمه فایل های ضمیمه

  3. #3
    کاربر دائمی آواتار maminb
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    Tehran
    پست
    132

    Post نقل قول: پیدا کردن اعداد تام (اعداد کامل)

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

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

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

  4. #4
    کاربر دائمی
    تاریخ عضویت
    آبان 1388
    محل زندگی
    مشهد
    سن
    38
    پست
    164

    نقل قول: پیدا کردن اعداد تام (اعداد کامل)

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

    موفق باشی

  5. #5
    کاربر دائمی آواتار maminb
    تاریخ عضویت
    خرداد 1387
    محل زندگی
    Tehran
    پست
    132

    Post نقل قول: پیدا کردن اعداد تام (اعداد کامل)

    عالی توضیح دادید! ممنون!

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

  6. #6
    کاربر دائمی
    تاریخ عضویت
    آبان 1388
    محل زندگی
    مشهد
    سن
    38
    پست
    164

    نقل قول: پیدا کردن اعداد تام (اعداد کامل)

    نقل قول نوشته شده توسط maminb مشاهده تاپیک
    آیا میتونم بگم یکی از دلایل کند شدن برنامم کار با تکست بود؟ یعنی باید از همون اول مثل شما با خود اعداد کار میکردم. درسته؟
    خواهش می کنم قابلی نداشت . اره همین موضوع خیلی سرعت رو می گیره علاوه بر این اگه اشتباه نکنم توی نگاه گذرایی که داشتم از Sleep هم استفاده کرده بودی که اینم خودش سرعت رو می گیره.

    موفق باشی

  7. #7
    کاربر دائمی آواتار Alghoochi
    تاریخ عضویت
    خرداد 1388
    محل زندگی
    C:\Windows
    پست
    390

    نقل قول: پیدا کردن اعداد تام (اعداد کامل)

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

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

  8. #8
    کاربر جدید آواتار مینا1377
    تاریخ عضویت
    مهر 1394
    محل زندگی
    یزد
    پست
    2

    نقل قول: پیدا کردن اعداد تام (اعداد کامل)

    ;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
    {
    {

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

  9. #9

    نقل قول: پیدا کردن اعداد تام (اعداد کامل)


قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •