PDA

View Full Version : یک مسئله در مورد مبنای اعداد



Iran-PC
جمعه 25 آذر 1384, 10:01 صبح
سلام به همگی.
یه سوال که شاید حل کردنش شما رو هم قلقلک بده.

به اعداد زیر توجه کنید

1
3
9
27
81
و
-1
-3
-9
-27
-81


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

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

28-12 = 16
هم نتونستم راستش
پرو‍ژه دانشگاهی و اینا هم نیست لطفا پاکش نکنید.(من اصلا دانشجو نیستم:لبخند:)

این مربوط به یک پروژه بزرگتره که انشاء الله وقتی تموم شد اینجا هم میذارمش.
ممنون

seyedof
جمعه 25 آذر 1384, 11:09 صبح
سلام
به نظر من ساده است. ببینید این اعداد پایه ای که نوشتید توانهای عدد 3 هستند. در واقع همونطور که در مبنای دو شما هر عددی رو میتونید به صورت باینری نمایش بدهید (معادل این است که هر عددی رو میتونید به صورت جمع توانهای دو بنویسید) در هر مبنای دیگه هم میشه اینکارو کرد. روش تبدیلش هم همون روش عمومی تبدیل مبنا از 10 به مبنای دلخواه است. یعنی توسط تقسیمات متوالی.
ممنون علی

Iran-PC
جمعه 25 آذر 1384, 11:22 صبح
سلام علی جان.
خیلی ممنون.
فکر کنم سوال رو درست توضیح ندادم.
شما یه بار گفته خودتون رو تست کنید.
میبینید که نمیشه
همین عدد 16 را با تقسیمات متوالی چطور میشه اعداد مثبت و منفیش رو بدست آورد؟

Iran-PC
شنبه 26 آذر 1384, 20:39 عصر
حل شد.

خیلی ممنون.

C++Lover
یک شنبه 27 آذر 1384, 20:02 عصر
بابا حل شد خالی که فایده نداره.
راه حلش رو بزارید ما هم ببینیم.
البته در صورت امکان.
متشکرم.

Iran-PC
یک شنبه 27 آذر 1384, 20:56 عصر
چون در نهایت با پاسکال میخواستم با پاسکال نوشتمش.
نمیدونم سی هم چیزی به اسم لیبل داره یا نه .



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;



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

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

Marine
یک شنبه 27 آذر 1384, 21:58 عصر
چون در نهایت با پاسکال میخواستم با پاسکال نوشتمش.
نمیدونم سی هم چیزی به اسم لیبل داره یا نه .



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;



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

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

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

C++Lover
یک شنبه 27 آذر 1384, 22:58 عصر
فردا صبح کلاس دارم وقت نمی شه رو کد شما فکر کنم اما این راه حل منه.



#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 بار اجرا می شه. البته در این مورد خاص زمان اجراش خیلی پایینه اما اگه سرعت براتون خیلی مهم باشه باید یه راه حل ریاضی پیدا کرد.
کدی که کار اصلی رو می کنه در واقع چهار خطه بقیش هم برای نمایش اعداد هستش.

در مورد اون فرمتی که گفتید می شه بیشتر توضیح بدی ، من سرم درد می کنه واسه این کارا، البته اگه این کلاسها برام وقتی باقی بزارن.

Iran-PC
دوشنبه 28 آذر 1384, 00:05 صبح
از توجهت خیلی ممنون.
منم باید کد شما رو زیر و رو کنم
کلک اینو کی نوشتی؟
چرا زودتر رو نکرده بودی پس؟

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

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

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

بابک زواری
دوشنبه 28 آذر 1384, 12:25 عصر
عنوان تاپیکت رو اصلاح کن تا حذف نشه

Iran-PC
دوشنبه 28 آذر 1384, 22:20 عصر
سلام
خوبید؟
من عوض کنم؟
مگه منم میتونم عنوان عوض کنم؟
چطوری؟
چشم سعی میکنم.

Iran-PC
دوشنبه 28 آذر 1384, 22:49 عصر
جناب مدیر من نتونستم اسمشو عوض کنم (راستش بلد نیستم)
یا یادم بدید یا خودتون زحمتشو بکشید.

C++Lover
سه شنبه 29 آذر 1384, 02:35 صبح
من متوجه نمی شم شما چه کار می خواهید بکنید.
این اعداد که کلا ده تا هستند ده بیت اشغال می کنند شما با این ده بیت و بوسیله این اعداد می توانید فقط 242+1 حالت داشته باشید. اما بوسیله همان ده بیت می توانید تا 1024 حالت مختلف در حالت عادی داشته باشید پس حجم خروجی بیشتر می شود.
همانطور که گفتم درست متوجه نشدم چه کار می خواهید بکنید. لطفا کمی بیشتر توضیح دهید.

Iran-PC
سه شنبه 29 آذر 1384, 23:02 عصر
سلام.
اول از مدیر تشکر کنم بابت تغیر نام تاپیک.
جناب لاور عزیز 10 بایت بابت مختصات X و 10 بایت بابت مختصات Y مصرف میشه.
میدونم میشه تا عدد 1024 از هر 10 بایت استفاده کرد اما من این این فورمت رو نساختم.
همونطور که گفتم هر کدوم از اون اعداد یک بیت منحصر به فرد دارند.
اما به نظر میرسه باز یه محاسباتی توش باشه.
یعنی به این سادگی ها هم نیست.
میخواهید شما ایمیلتونو بدید من براتون فایل رو بفرستم.
فایل اگزه هستش اگه اجراش میکنید من بفرستم.
اگه قرار به فرستادن شد چند تا از نمونه ها رو هم میگذارم.
نمونه هاشو که ببینید متوجه میشید برای چه کاری استفاده میشه.
توضیحش خیلی طولانیه.