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

من موسوعة حسوب
اذهب إلى: تصفح، ابحث

تحوّل هذه الخوارزمية العدد المعطى من أي نظام إلى النظام العشري. يمكن استخدام أي أساس للعدد المعطى، وتمثّل الأعداد باستخدام الأرقام 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)); 
} 
}

مصادر