المساعد الشخصي الرقمي

مشاهدة النسخة كاملة : هل هناك طريقة للتحويل بين نظم الاعداد ؟


المـهاجر
28-09-2016, 01:22 AM
السلام عليكم ورحمة الله وبركاته

هل هناك طريقة لتحويل الأعداد للأنظمة غير الشائعة
مثلا للثلاثى او الخماسى او الثلاثينى .... الخ ؟
و شكرا
:abc_139:

عبود عبود
28-09-2016, 09:37 AM
لا أعلم أو لم أهتم قبل ذلك بالمعرفة ...... معذرة لى

ولكن متابع لمحاولة المعرفة معكم والإستفادة مما يدور فى هذا الموضوع

ثامر أبو بلقيس
28-09-2016, 02:17 PM
القسمة على 5 دائما و الاحتفاظ بالباقي .. البواقي كما تعرف ستعطينا الكتابة للعدد في النظام الخماسي
القسمة على 3 دائما و الاحتفاظ بالباقي .. البواقي كما تعرف ستعطينا الكتابة للعدد في النظام الثلاثي
القسمة على 30 دائما و الاحتفاظ بالباقي .. البواقي كما تعرف ستعطينا الكتابة للعدد في النظام الثلاثيتي إن صح التعبير
------------
صديقي الاحتفاظ بالبواقي بالمقلوب كما تعرف و القسمة طبعا بدون المرور إلى الأجزاء العشرية أي ليست تامة

اعذرني أخي في الوقت الراهن ظروفي ضدي لا أملك 10 دقائق أجلس فيها في البيت .. تستاهل أن الفرد يجيبك سواء كان طلبا أو تمرينا لكنها ظروف فرضت عني التفاعل مع
موضوعك على الأقل بكلمات حتى أجد فرصة لأشارك بما يفيد موفق مشكور على السؤال الجيد :abc_022:

مثال :
للتحويل إلى الثلاثي
p = String.ToNumber(Input.GetText("Input1"));
g =""
x=1
repeat
p,n =Math.Floor(p/3),Math.Mod(p,3)
x=x+1;g=g..n;
until p <=0
Dialog.Message("Notice", string.reverse (g));

وشوف اذ صح قيس عليها

المـهاجر
28-09-2016, 07:29 PM
في النظام الثلاثيتي إن صح التعبير

نعم يصح جدا هذا التعبير
كون التعبير غير شائع لا يجعله غير صحيح


اعذرني أخي في الوقت الراهن ظروفي ضدي لا أملك 10 دقائق أجلس فيها في البيت .. تستاهل أن الفرد يجيبك سواء كان طلبا أو تمرينا لكنها ظروف فرضت عني التفاعل مع
موضوعك على الأقل بكلمات حتى أجد فرصة لأشارك بما يفيد موفق مشكور على السؤال الجيد :abc_022:


شكرا اخى الكريم على تخصيص الوقت وفقك الله
هذا شيئ محل تقديرى و اعزازى و متوقع منكم

مثال :
للتحويل إلى الثلاثي
p = String.ToNumber(Input.GetText("Input1"));
g =""
x=1
repeat
p,n =Math.Floor(p/3),Math.Mod(p,3)
x=x+1;g=g..n;
until p <=0
Dialog.Message("Notice", string.reverse (g));

وشوف اذ صح قيس عليها

صحيح 100% :abc_152:

و هذا هو القياس عليها
function Num_Sys(num,sys)
p = String.ToNumber(num);
g =""
repeat
p,n =Math.Floor(p/sys),Math.Mod(p,sys)
g=g..n;
until p <=0
return string.reverse (g)
end

result = Num_Sys(30,3)
Dialog.Message("Notice", result);

function Num_Sys(num,sys)
حيث num هى الرقم المطلوب تحويله
و sys هو النظام العددى المراد التحويل اليه
result = Num_Sys(30,6)
Dialog.Message("Notice", result);
مثلا هذا الكود سيحسب قيمة 30 فى النظام السداسي

الدالة فعالة جدا حتى النظام العشرى ( يمكن التعويض عن sys برقم من 2 إلى 10 )
لأنه كما تعلم ان الأمور تتغير بعد العشرى الى استخدام الحروف الانجليزية

مثلا 99999999999999 فى النظام العشري تعادل ZG3D62R5R فى النظام السادس و الثلاثينى

استمتعت جدا بمداخلتك القوية و اكوادك الواضحة
لكن
للحديث بقية :abc_139:

المـهاجر
28-09-2016, 08:53 PM
:abc_087: الأنظمة العددية تبدأ من الثنائى و تنتهى بالنظام الرابع و الستينى (على حد علمى قد يكون هناك أكثر .. لا أعلم ) :abc_088:
من الثنائى و حتى العشرى لا يتم استخدام أحرف
يستخدم فقط كل او بعض الاعداد من 0 حتى 9 [0123456789]

من النظام 11 و حتى 36 يضاف إستخدام بعض او كل الأحرف الانجليزية (26 حرف) دون النظر لحالة الحرف سمول او كابتل فمثلا الرقم A أو a يساوى 10

من النظام 37 و حتى 64 يتم التفرقة بين الأحرف الكبيرة و الصغيرة فنجد A تساوى 10 بينما a تساوى 36
:abc_152:

ثامر أبو بلقيس
28-09-2016, 09:44 PM
نعم أخي الكريم في قراءة مثلا لأنظمة العد في النظام الثلاثيني
قد تكون هاته المحاولة قريبة للصحة إن شاء الله لكنها تبقى محاولة لأن الموضوع يحتاج لدراسة أنظمة العد و فهمها أكثر من التنفيذ
p = String.ToNumber(Input.GetText("Input1"));
my_table = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T"};
g ="";x=1
repeat
p,n =Math.Floor(p/30),Math.Mod(p,30)
x=x+1
if n >= 10 and n < 20 then
x1 = String.Mid(n, 1, 1)+ String.Mid(n, 2, 1)
n =my_table[x1]
elseif n >= 20 then
x2 = n-9
n =my_table[x2]
end
g=g..n
until p <=0
Dialog.Message("Notice", string.reverse (g));

ثامر أبو بلقيس
28-09-2016, 10:21 PM
أعجبني هذا الحل الشامل كثيرا فنقلته لك :
local floor,insert = math.floor, table.insert
function basen(n,b)
n = floor(n)
if not b or b == 10 then return tostring(n) end
local digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
local t = {}
local sign = ""
if n < 0 then
sign = "-"
n = -n
end
repeat
local d = (n % b) + 1
n = floor(n / b)
insert(t, 1, digits:sub(d,d))
until n == 0
return sign .. table.concat(t,"")
end
----------------------------------------

Dialog.Message("Notice", basen("99999999999999",36));

المـهاجر
28-09-2016, 10:34 PM
شكرا اخى الكريم لنقل الكود الأخير فهو اكثر من ممتاز
سأعتمده بعد حذف ما يخص الاشارة
local floor,insert = math.floor, table.insert
function basen(n,b)
n = floor(n)
if not b or b == 10 then return tostring(n) end
local digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
local t = {}
repeat
local d = (n % b) + 1
n = floor(n / b)
insert(t, 1, digits:sub(d,d))
until n == 0
return table.concat(t,"")
end

حالما افرغ سأحاول التعديل للوصول للأنظمة من 37 حتى 64 بالتعديل على الكود السابق
تقبل فائق تحياتى
:abc_152:

ثامر أبو بلقيس
28-09-2016, 10:44 PM
في نظام العد 37 للعدد " 99999999999999 " يعطي ناتج صحيح وهو SHEBQXIZP
في نظام العد 38 للعدد " 99999999999999 " يعطي ناتج صحيح وهو N009WHSCF
في نظام العد 39 للعدد " 99999999999999 " يعطي ناتج صحيح وهو IQR93ZEEL

ابتداء من نظام العد 40 يبدأ يعطي نتائج غير صحيحة موفق :abc_138:

المـهاجر
28-09-2016, 10:55 PM
في نظام العد 37 للعدد " 99999999999999 " يعطي ناتج صحيح وهو SHEBQXIZP
في نظام العد 38 للعدد " 99999999999999 " يعطي ناتج صحيح وهو N009WHSCF
في نظام العد 39 للعدد " 99999999999999 " يعطي ناتج صحيح وهو IQR93ZEEL

ابتداء من نظام العد 40 يبدأ يعطي نتائج غير صحيحة موفق :abc_138:

سبق التوضيح فى مشاركة 5
الحل أبسط مما تتصور
function Num_Sys(num,sys)
num = math.floor(num)
if not sys or sys == 10 then return tostring(num) end
local Numbers = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn opqrstuvwxyz"
local t = {}
repeat
local d = (num % sys) + 1
num = math.floor(num / sys)
table.insert(t, 1, string.sub(Numbers, d, d))
until num == 0
return table.concat(t,"")
end
هذا سيعمل بشكل صحيح من النظام الثنائى و حتى نظام 62 فقط
لاحظ
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn opqrstuvwxyz"
عدد المحارف = 10 أرقام + 26 كابتل +26 سمول = 62
يبقى محرفان اعتقد انهما / و +
لا احب التخمين
ساكتفى حتى ال 62 مؤقتا
موفق
:abc_152:

ثامر أبو بلقيس
28-09-2016, 11:28 PM
بارك الله فيك يظهر أن المشكل عندي و لا أعرف السبب
صورة
http://e.top4top.net/p_271uwes1.png

لا أعرف لما الكود الأخير أعطى النتيجة الظاهرة أسفل و هي غير النتيجة التي تظهرها لغة برمجية أخرى
يبدو أن الأمر يتعلق مثلا يالجهاز ؟ أو اللغة ؟

ما سبب النتيجة CLJ6^2N1[ هده و ما سبب الرموز الغريبة التي صارت تظهر بدء من نظام العد 40 فما فوق :abc_138:

المـهاجر
28-09-2016, 11:33 PM
جرب
function Num_Sys(num,sys)
num = math.floor(num)
if not sys or sys == 10 then return tostring(num) end
local Numbers = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn opqrstuvwxyz+/"
local t = {}
repeat
local d = (num % sys) + 1
num = math.floor(num / sys)
table.insert(t, 1, Numbers:sub(d,d))
until num == 0
return table.concat(t,"")
end
يحتاج لضبط نتائج نظام 63 و 64 فقط

غير نوع خط الانبوت و اجعل سكربت الفونت انجلش
و يمكنك مراجعة هذا الموقع للتأكد من النتائج
http://convertxy.com/index.php/numberbases/
انتقى الأنظمة المطلوبة من يسار الصفحة فى الموقع
موفق

ثامر أبو بلقيس
29-09-2016, 12:07 AM
جرب
function Num_Sys(num,sys)
num = math.floor(num)
if not sys or sys == 10 then return tostring(num) end
local Numbers = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn opqrstuvwxyz+/"
local t = {}
repeat
local d = (num % sys) + 1
num = math.floor(num / sys)
table.insert(t, 1, Numbers:sub(d,d))
until num == 0
return table.concat(t,"")
end
يحتاج لضبط نتائج نظام 63 و 64 فقط

غير نوع خط الانبوت و اجعل سكربت الفونت انجلش
و يمكنك مراجعة هذا الموقع للتأكد من النتائج
http://convertxy.com/index.php/numberbases/
انتقى الأنظمة المطلوبة من يسار الصفحة فى الموقع
موفق

تم التأكد من دقة الأكواد كما تم رمي و الاستغناء على الأداة المستعملة في مقارنة النتائج من قبلي أحسنت :abc_138:

ثامر أبو بلقيس
04-07-2017, 02:33 AM
يرفع :abc_152: