التحويل من أي نظام إلى النظام العشري وبالعكس

من موسوعة حسوب

تحوّل هذه الخوارزمية العدد المعطى من أي نظام إلى النظام العشري. يمكن استخدام أي أساس للعدد المعطى، وتمثّل الأعداد باستخدام الأرقام 0 إلى 9 والحروف A إلى Z. يرمز الحرف A إلى الحرف العدد 10 والحرف B إلى العدد 11 وهكذا.

مثال:

Input: str = "1100", base = 2 
Output: 12

Input: str = "11A", base = 16
Output: 282

Input: str = "123",  base = 8
Output: 83

خطوات الخوارزمية

يمكن استخدام الصيغة التالية للتحويل من أي أساس إلى الأساس العشري:

  1*str[len-1] + base*str[len-2] + (base)2*str[len-2] + ...

تمثل "str" العدد المدخل بهيئة سلسلة نصية، وتمثّل "base" أساس العد المدخل.

تنفيذ الخوارزمية

تعرض الأمثلة التالية طريقة تنفيذ الخوارزمية في عدد من لغات البرمجة:

  • C++:
#include <stdio.h> 
#include <string.h> 

// تعيد الدالة قيمة الحرف المعطى.
// فعلى سبيل المثال، تعيد الدالة 2 للحرف '2'
// وتعيد 10 للحرف 'A'
// وتعيد 11 للحرف 'B'
int val(char c) 
{ 
	if (c >= '0' && c <= '9') 
		return (int)c - '0'; 
	else
		return (int)c - 'A' + 10; 
} 

// تحوّل الدالة العدد من الأساس المعطى إلى الأساس العشري 
int toDeci(char *str, int base) 
{ 
	int len = strlen(str); 
	int power = 1; // Initialize power of base 
	int num = 0; // Initialize result 
	int i; 

	for (i = len - 1; i >= 0; i--) 
	{ 
		// يجب أن يكون العدد المدخل أصغر من أساس العدد
		// A digit in input number must be 
		// less than number's base 
		if (val(str[i]) >= base) 
		{ 
		printf("Invalid Number"); 
		return -1; 
		} 

		num += val(str[i]) * power; 
		power = power * base; 
	} 

	return num; 
} 

// اختبار الدوال السابقة
int main() 
{ 
	char str[] = "11A"; 
	int base = 16; 
	printf("Decimal equivalent of %s in base %d is "
		" %d\n", str, base, toDeci(str, base)); 
	return 0; 
}
  • بايثون:
# تعيد الدالة قيمة الحرف المعطى.
# فعلى سبيل المثال، تعيد الدالة 2 للحرف '2'
# وتعيد 10 للحرف 'A'
# وتعيد 11 للحرف 'B'
def val(c): 
	if c >= '0' and c <= '9': 
		return ord(c) - ord('0') 
	else: 
		return ord(c) - ord('A') + 10; 

# تحوّل الدالة العدد من الأساس المعطى إلى الأساس العشري  
def toDeci(str,base): 
	llen = len(str) 
	power = 1 #Initialize power of base 
	num = 0	 #Initialize result 

	for i in range(llen - 1, -1, -1): 
		
		# يجب أن يكون العدد المدخل أصغر من أساس العدد
		if val(str[i]) >= base: 
			print('Invalid Number') 
			return -1
		num += val(str[i]) * power 
		power = power * base 
	return num 
	
# اختبار الدوال السابقة
strr = "11A"
base = 16
print('Decimal equivalent of', strr, 
			'in base', base, 'is', 
				toDeci(strr, base))
  • جافا:
import java.io.*; 

class GFG 
{ 
// تعيد الدالة قيمة الحرف المعطى.
// فعلى سبيل المثال، تعيد الدالة 2 للحرف '2'
// وتعيد 10 للحرف 'A'
// وتعيد 11 للحرف 'B'
static int val(char c) 
{ 
	if (c >= '0' && c <= '9') 
		return (int)c - '0'; 
	else
		return (int)c - 'A' + 10; 
} 

//  يحوّل التابع العدد من الأساس المعطى إلى الأساس العشري  
static int toDeci(String str, 
				int base) 
{ 
	int len = str.length(); 
	int power = 1;
	int num = 0;
	int i; 

	for (i = len - 1; i >= 0; i--) 
	{ 
		//يجب أن يكون العدد المدخل أصغر من أساس العدد
		if (val(str.charAt(i)) >= base) 
		{ 
		System.out.println("Invalid Number"); 
		return -1; 
		} 

		num += val(str.charAt(i)) * power; 
		power = power * base; 
	} 

	return num; 
} 

// اختبار التوابع السابقة
public static void main (String[] args) 
{ 
	String str = "11A"; 
	int base = 16; 
	System.out.println("Decimal equivalent of "+ 
						str + " in base "+ base + 
									" is "+ " "+ 
							toDeci(str, base)); 
} 
}

مصادر