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

نام تاپیک: یک مسئله در مورد مبنای اعداد

  1. #1

    یک مسئله در مورد مبنای اعداد

    سلام به همگی.
    یه سوال که شاید حل کردنش شما رو هم قلقلک بده.

    به اعداد زیر توجه کنید
    1
    3
    9
    27
    81
    و
    -1
    -3
    -9
    -27
    -81


    با استفاده از این اعداد میشه اعداد بین -121 تا +121 را ساخت.
    حالا میخوام الگوریتمی طراحی کنیم که بتونه این کار رو برامون انجام بده.
    یعنی
    ما یک عدد بهش بدیم و اون با استفاده از این اعداد و از هر کدام فقط یکبار بتونه بگه جمع اعداد مثبت سازنده این عدد و جمع اعداد منفی این عدد چی هست.
    یه مثال میزنم

    عدد 16
    اعداد مثبت =
    27 + 1
    اعداد منفی =
    9 + 3
    اینجوری میشه
    28-12 = 16

    هم نتونستم راستش
    پرو‍ژه دانشگاهی و اینا هم نیست لطفا پاکش نکنید.(من اصلا دانشجو نیستم)

    این مربوط به یک پروژه بزرگتره که انشاء الله وقتی تموم شد اینجا هم میذارمش.
    ممنون
    آخرین ویرایش به وسیله Iran-PC : دوشنبه 28 آذر 1384 در 23:05 عصر

  2. #2
    سلام
    به نظر من ساده است. ببینید این اعداد پایه ای که نوشتید توانهای عدد 3 هستند. در واقع همونطور که در مبنای دو شما هر عددی رو میتونید به صورت باینری نمایش بدهید (معادل این است که هر عددی رو میتونید به صورت جمع توانهای دو بنویسید) در هر مبنای دیگه هم میشه اینکارو کرد. روش تبدیلش هم همون روش عمومی تبدیل مبنا از 10 به مبنای دلخواه است. یعنی توسط تقسیمات متوالی.
    ممنون علی

  3. #3
    سلام علی جان.
    خیلی ممنون.
    فکر کنم سوال رو درست توضیح ندادم.
    شما یه بار گفته خودتون رو تست کنید.
    میبینید که نمیشه
    همین عدد 16 را با تقسیمات متوالی چطور میشه اعداد مثبت و منفیش رو بدست آورد؟

  4. #4
    حل شد.

    خیلی ممنون.

  5. #5
    بابا حل شد خالی که فایده نداره.
    راه حلش رو بزارید ما هم ببینیم.
    البته در صورت امکان.
    متشکرم.

  6. #6
    چون در نهایت با پاسکال میخواستم با پاسکال نوشتمش.
    نمیدونم سی هم چیزی به اسم لیبل داره یا نه .


    Procedure Get_Num(Numb : ShortInt; Var Jam, Menha : Byte);
    Var
    J, M : Byte;
    N: ShortInt;
    label ende, bala;
    Begin
    N := Numb;
    J := 0;
    M := 0;
    If (Numb > -122) And (Numb < 122) Then
    Begin
    Bala :
    If N >= 0 Then
    Begin
    If (N > 40) And (N <= 121) Then Begin Inc(J, 81); Dec(N, 81); Goto Bala; End;
    If (N > 13) And (N <= 40) Then Begin Inc(J, 27); Dec(N, 27); Goto Bala; End;
    If (N > 4) And (N <= 13) Then Begin Inc(J, 9); Dec(N, 9); Goto Bala; End;
    If (N > 1) And (N <= 4) Then Begin Inc(J, 3); Dec(N, 3); Goto Bala; End;
    If N = 1 Then Begin Inc(J, 1); Dec(N, 1); Goto Ende; End;
    If N = 0 Then Goto Ende;
    End Else
    Begin
    If (N < -40) And (N >= -121) Then Begin Inc(M, 81); Inc(N, 81); Goto Bala; End;
    If (N < -13) And (N >= -40) Then Begin Inc(M, 27); Inc(N, 27); Goto Bala; End;
    If (N < -4) And (N >= -13) Then Begin Inc(M, 9); Inc(N, 9); Goto Bala; End;
    If (N < -1) And (N >= -4) Then Begin Inc(M, 3); Inc(N, 3); Goto Bala; End;
    If N = -1 Then Begin Inc(M, 1); Inc(N, 1); Goto Ende; End;
    If N = 0 Then Goto Ende;
    End;
    End;
    Ende :
    Menha := M;
    Jam := J;
    End;



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

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

  7. #7
    نقل قول نوشته شده توسط Iran-PC
    چون در نهایت با پاسکال میخواستم با پاسکال نوشتمش.
    نمیدونم سی هم چیزی به اسم لیبل داره یا نه .


    Procedure Get_Num(Numb : ShortInt; Var Jam, Menha : Byte);
    Var
    J, M : Byte;
    N: ShortInt;
    label ende, bala;
    Begin
    N := Numb;
    J := 0;
    M := 0;
    If (Numb > -122) And (Numb < 122) Then
    Begin
    Bala :
    If N >= 0 Then
    Begin
    If (N > 40) And (N <= 121) Then Begin Inc(J, 81); Dec(N, 81); Goto Bala; End;
    If (N > 13) And (N <= 40) Then Begin Inc(J, 27); Dec(N, 27); Goto Bala; End;
    If (N > 4) And (N <= 13) Then Begin Inc(J, 9); Dec(N, 9); Goto Bala; End;
    If (N > 1) And (N <= 4) Then Begin Inc(J, 3); Dec(N, 3); Goto Bala; End;
    If N = 1 Then Begin Inc(J, 1); Dec(N, 1); Goto Ende; End;
    If N = 0 Then Goto Ende;
    End Else
    Begin
    If (N < -40) And (N >= -121) Then Begin Inc(M, 81); Inc(N, 81); Goto Bala; End;
    If (N < -13) And (N >= -40) Then Begin Inc(M, 27); Inc(N, 27); Goto Bala; End;
    If (N < -4) And (N >= -13) Then Begin Inc(M, 9); Inc(N, 9); Goto Bala; End;
    If (N < -1) And (N >= -4) Then Begin Inc(M, 3); Inc(N, 3); Goto Bala; End;
    If N = -1 Then Begin Inc(M, 1); Inc(N, 1); Goto Ende; End;
    If N = 0 Then Goto Ende;
    End;
    End;
    Ende :
    Menha := M;
    Jam := J;
    End;



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

    دارم روی یه فرمتی کار میکنم.
    یه چیزایی در مورد این فورمت فهمیدم.
    اگه کسی هست که وقت آزاد داشته باشه و دلش برای پیدا کردن قیلی ویلی میره بگه که مساله رو عنوان کنم.
    اگه این شرایط رو ندارید خواهشا چیزی نگید چون مطرح کردن سوالش اگه فایده ای نداشته باشه دردسر ساز میشه.
    خیلی ممنون.
    بله ، سی هم لیبل داره
    ولی همونطور که استادت گفته استفاده از لیبل در برنامه نویسی نوین توصیه نمیشه
    هر کاری که با لیبل انجام میشه رو با استفاده از بقیه ساختارهای کنترل میشه پیاده سازی کرد

  8. #8
    فردا صبح کلاس دارم وقت نمی شه رو کد شما فکر کنم اما این راه حل منه.


    #define CalcNumber(coef) \
    ((coef&1)*-81 + ((coef&2)>>1)*-27 + ((coef&4)>>2)*-9 + ((coef&8)>>3)*-3 + ((coef&16)>>4)*-1 + \
    ((coef&32)>>5)*81 + ((coef&64)>>6)*27 + ((coef&128)>>7)*9 + ((coef&256)>>8)*3 + ((coef&512)>>9)*1)

    int CalcCoefficients(int coef, int num)
    {
    if (CalcNumber(coef) == num) return coef;
    return CalcCoefficients(coef+1, num);
    }

    int main()
    {
    int coefficients = 0;
    int num;
    cout << "Enter a number between -121 to 121 : ";
    cin >> num ;

    int coef = CalcCoefficients(coefficients, num);
    cout << ((coef&1 ) ? "-81" : "")
    << ((coef&2 ) ? "-27" : "")
    << ((coef&4 ) ? "-9" : "")
    << ((coef&8 ) ? "-3" : "")
    << ((coef&16) ? "-1" : "")
    << ((coef&32) ? "+81" : "")
    << ((coef&64) ? "+27" : "")
    << ((coef&128) ? "+9" : "")
    << ((coef&256) ? "+3" : "")
    << ((coef&512) ? "+1" : "")
    << "\n";

    return 0;
    }


    استفاده از یک tree search با یک تابع recursive که یه جورایی راه حل تنبلهاست. این تابع در بیشترین حالت 1024 بار اجرا می شه. البته در این مورد خاص زمان اجراش خیلی پایینه اما اگه سرعت براتون خیلی مهم باشه باید یه راه حل ریاضی پیدا کرد.
    کدی که کار اصلی رو می کنه در واقع چهار خطه بقیش هم برای نمایش اعداد هستش.

    در مورد اون فرمتی که گفتید می شه بیشتر توضیح بدی ، من سرم درد می کنه واسه این کارا، البته اگه این کلاسها برام وقتی باقی بزارن.
    آخرین ویرایش به وسیله C++‎Lover : یک شنبه 27 آذر 1384 در 23:05 عصر

  9. #9
    از توجهت خیلی ممنون.
    منم باید کد شما رو زیر و رو کنم
    کلک اینو کی نوشتی؟
    چرا زودتر رو نکرده بودی پس؟

    اما اون فورمت.
    دهنمو سرویس کرده.
    خیلی بهش نزدیک شدم.
    اما .....
    شاید بشه گفت یه نوع فورمت برای فایل تصویریه.
    البته کاربردش چیز دیگه ای هست.
    ولی خوب نتیجه این فایل یک تصویره که فقط با خط ساخته شده.
    خطهایی که بصورت پشت سر هم قرار گرفتند و مختصاتشون نسبت به مختصات قبلی بیان میشه.
    که با linerel رسم میشند.

    هر کدام از اون اعدادی که بالا گفتم در این فورمت یک بیت مخصوص به خودشون رو دارند.
    (از یک مجموعه 3 بایتی)
    که در مجموع میشند 20 بیت
    و 4 بیت باقی مانده کد های مخصوصی هستند که کد دستوریند.
    من جای این اعداد و بیتها رو پیدا کردم ولی نمیدونم چرا با 81 ها مشکل داره.
    احتمالا نحوه استفاده از این 81 ها با بقیه اعداد فرق میکنه.
    من میخوام نحوه استفاده از این 81 ها و در اصل خواندن صحیح این به اصطلاح فایل تصویری رو انجام بدم.
    البته برنامه ای دارم که این گونه فایل ها رو بخونه.
    میشه با امتحان و خطا و با کمک این برنامه پیداش کرد.
    ولی مشکلاتی هم هست
    اینکه این برنامه تو ویندوز ایکس پی به درستی کار نمیکنه و من مجبورم با سی دی بوت بیام بالا و هی از محیط برنامه نویسی به محیط این برنامه برم و بالعکس.
    اینه که اعصابم رو خورد کرده.
    البته من مشغولیات ذهنی زیادی دارم.
    ممکنه اگه شما ببینی تو همون نگاه اول مشکل رو حل کنی.
    من کمی عجله هم دارم.
    اگر وقت داشتید بگید تا برنامه ها رو براتون بفرستم.
    البته کلی توضیحات هم میخواد که نمیدونم چطوری بهتون بگم.

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

  10. #10
    کاربر دائمی
    تاریخ عضویت
    بهمن 1382
    محل زندگی
    فعلا ایران - فعلا تهران
    پست
    2,628
    عنوان تاپیکت رو اصلاح کن تا حذف نشه

  11. #11
    سلام
    خوبید؟
    من عوض کنم؟
    مگه منم میتونم عنوان عوض کنم؟
    چطوری؟
    چشم سعی میکنم.

  12. #12
    جناب مدیر من نتونستم اسمشو عوض کنم (راستش بلد نیستم)
    یا یادم بدید یا خودتون زحمتشو بکشید.

  13. #13
    من متوجه نمی شم شما چه کار می خواهید بکنید.
    این اعداد که کلا ده تا هستند ده بیت اشغال می کنند شما با این ده بیت و بوسیله این اعداد می توانید فقط 242+1 حالت داشته باشید. اما بوسیله همان ده بیت می توانید تا 1024 حالت مختلف در حالت عادی داشته باشید پس حجم خروجی بیشتر می شود.
    همانطور که گفتم درست متوجه نشدم چه کار می خواهید بکنید. لطفا کمی بیشتر توضیح دهید.

  14. #14
    سلام.
    اول از مدیر تشکر کنم بابت تغیر نام تاپیک.
    جناب لاور عزیز 10 بایت بابت مختصات X و 10 بایت بابت مختصات Y مصرف میشه.
    میدونم میشه تا عدد 1024 از هر 10 بایت استفاده کرد اما من این این فورمت رو نساختم.
    همونطور که گفتم هر کدوم از اون اعداد یک بیت منحصر به فرد دارند.
    اما به نظر میرسه باز یه محاسباتی توش باشه.
    یعنی به این سادگی ها هم نیست.
    میخواهید شما ایمیلتونو بدید من براتون فایل رو بفرستم.
    فایل اگزه هستش اگه اجراش میکنید من بفرستم.
    اگه قرار به فرستادن شد چند تا از نمونه ها رو هم میگذارم.
    نمونه هاشو که ببینید متوجه میشید برای چه کاری استفاده میشه.
    توضیحش خیلی طولانیه.

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

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