PDA

View Full Version : تبديل عدد از مبناي 10 به مبناي 32 و بلعکس



h_mohamadi
دوشنبه 17 بهمن 1390, 14:33 عصر
با سلام خدمت دوستان گرامي
من يک مشکل داشتم که مي خواستم اساتيد من را اهنمايي کنند.
من مي خواهم يک عدد را از مبناي 10 به مبناي 32 تبديل کننم و عدد در مبناي 32 را هم به 10 برگردانم.مي خواستم بدانم کسي سورس يا يونيک و يا فانکشني مي شناسد يا دارد که به من کمک کند.
با تشکر فراوان از شما

Mahmood_M
دوشنبه 17 بهمن 1390, 15:39 عصر
برای تبدیل یک عدد از مبنای 10 به مبنای N ، عدد مورد نظر رو تا زمانی که بزرگتر و مساوی N هست ، بر N تقسیم میکنید و هر بار باقیمانده های تقسیم رو مثلا در یک آرایه قرار میدید ، بعد باقی مانده ها ( عناصر آرایه ) رو از آخر به اول در کنار هم قرار میدید تا حاصل بدست بیاد
برای اعداد ( باقیمانده های ) دو رقمی از حروف انگلیسی استفاده می کنید ( به ترتیب برای 10 ، 11 ، 12 و ... حروف A و B و C و ... قرار می دید )
نمونه :

function ConvertTo32(N : Integer) : String;
var
L, I : Integer;
A : Array of Integer;
S, STemp : String;
begin
L := 0;

if N < 32 then
begin
SetLength(A, 1);
A[0] := N;
end
else
begin
while N >= 32 do
begin
L := L + 1;
SetLength(A, L);
A[L-1] := N mod 32;
N := N div 32;
if N < 32 then
begin
SetLength(A, L+1);
A[L] := N;
end;
end;
end;

for I := Length(A) - 1 downto 0 do
begin
case A[I] of
10 : STemp := 'A';
11 : STemp := 'B';
12 : STemp := 'C';
13 : STemp := 'D';
14 : STemp := 'E';
15 : STemp := 'F';
16 : STemp := 'G';
17 : STemp := 'H';
18 : STemp := 'I';
19 : STemp := 'J';
20 : STemp := 'K';
21 : STemp := 'L';
22 : STemp := 'M';
23 : STemp := 'N';
24 : STemp := 'O';
25 : STemp := 'P';
26 : STemp := 'Q';
27 : STemp := 'R';
28 : STemp := 'S';
29 : STemp := 'T';
30 : STemp := 'U';
31 : STemp := 'V';
else
STemp := IntToStr(A[I]);
end;
S := S + STemp;
end;

Result := S;
end;


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

h_mohamadi
سه شنبه 18 بهمن 1390, 12:17 عصر
برای تبدیل یک عدد از مبنای 10 به مبنای N ، عدد مورد نظر رو تا زمانی که بزرگتر و مساوی N هست ، بر N تقسیم میکنید و هر بار باقیمانده های تقسیم رو مثلا در یک آرایه قرار میدید ، بعد باقی مانده ها ( عناصر آرایه ) رو از آخر به اول در کنار هم قرار میدید تا حاصل بدست بیاد
برای اعداد ( باقیمانده های ) دو رقمی از حروف انگلیسی استفاده می کنید ( به ترتیب برای 10 ، 11 ، 12 و ... حروف A و B و C و ... قرار می دید )
نمونه :

function ConvertTo32(N : Integer) : String;
var
L, I : Integer;
A : Array of Integer;
S, STemp : String;
begin
L := 0;

if N < 32 then
begin
SetLength(A, 1);
A[0] := N;
end
else
begin
while N >= 32 do
begin
L := L + 1;
SetLength(A, L);
A[L-1] := N mod 32;
N := N div 32;
if N < 32 then
begin
SetLength(A, L+1);
A[L] := N;
end;
end;
end;

for I := Length(A) - 1 downto 0 do
begin
case A[I] of
10 : STemp := 'A';
11 : STemp := 'B';
12 : STemp := 'C';
13 : STemp := 'D';
14 : STemp := 'E';
15 : STemp := 'F';
16 : STemp := 'G';
17 : STemp := 'H';
18 : STemp := 'I';
19 : STemp := 'J';
20 : STemp := 'K';
21 : STemp := 'L';
22 : STemp := 'M';
23 : STemp := 'N';
24 : STemp := 'O';
25 : STemp := 'P';
26 : STemp := 'Q';
27 : STemp := 'R';
28 : STemp := 'S';
29 : STemp := 'T';
30 : STemp := 'U';
31 : STemp := 'V';
else
STemp := IntToStr(A[I]);
end;
S := S + STemp;
end;

Result := S;
end;


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

ممنونم از راهنمایی خوبتان
اما من 3 تا مشکل دارم
اول اینکه من مبنای 36 را می خواهم
دوم اینکه از 10 رقم که بیشتر می زنم پیغام می دهد
سوم اینکه حالا اگر بخواهم دوباره مبنای 36 را به 10 برگردام چکار کنم

h_mohamadi
پنج شنبه 20 بهمن 1390, 08:21 صبح
کسی به ما جواب نمی دهد؟؟

SAASTN
پنج شنبه 20 بهمن 1390, 09:50 صبح
اول اینکه من مبنای 36 را می خواهم
اول این که شما تو پست اولت گفتی 32، اسنادشم موجوده ... بعدش خو تو کد آقا محمود بیا همه 32 ها رو بکن 36 به اون case هم چهارتا آیتم اضافه کن دیگه ...

دوم اینکه از 10 رقم که بیشتر می زنم پیغام می دهد
برای گزارش خطا، خطی که خطا داره و متن خطا رو قرار بدین، دیگه از شما با این سابقه فعالیت انتظار میره این موارد رو رعایت کنید.

سوم اینکه حالا اگر بخواهم دوباره مبنای 36 را به 10 برگردام چکار کنم
خوب اینم که یه حلقه است، مثلا اگه 265 یه عدد در مبنا 8 باشه بردنش به مبنای 10 اینجوری میشه:
5 * 8^0 + 6 * 8^1 + 2 * 8^2
یا اگه ALI یه عدد در مبنای 36 باشه دسیمالش اینجوری میشه:
10 * 36^0 + 21 * 36^1 + 18 * 36^2