m進制轉n進制和實例——2031 進制轉換

目錄

Description

Procedure

2031 進制轉換

其他


 


 

 


Description

  •  給定m進制數a,可使用m進制轉n進制算法將其轉換成n進制數b;
  •  重要的是它的思想,這個算法的核心就是下文的(I)至(III)三個公式,(I)式關鍵的就在於獲取參數t的值的策略,就是分成了三種情況(/* classic */ ),這種映射的思想很基本,另外就是基本的字符串處理,基本的ASCII碼。

  (處理不了大數和浮點數真的想進制轉換隻需用

cin >> hex >> a;
cout << dec << a;

     這樣就可以了 )

 


 

Procedure

/* M進制轉10進制 */
int RadixM2Dec(char str[], int size, int radix) {
        
        /* ans存放10進制 */
	int ans = 0, t;

        /* 一般情況下負數就不用管了 */
	for (int i = (str[0] == '-' ? 1 : 0); i < size; i++) {

                /* classic */
		if (str[i] < '9')
			t = str[i] - '0';
		else if ('A' <= str[i] && str[i] <= 'F')
			t = str[i] - 'A' + 10;
		else
			t = str[i] - 'a' + 10;

                /* 加權公式 */
		ans = ans * radix + t;      /* (I) */
	}
	return str[0] == '-' ? -ans : ans;
}

/* 10進制轉M進制需要3步,1)轉換後的串以棧形式返回 */
stack<int> Dec2RadixM(int num, int radix) {
	stack<int> ans;
	while (num) {
                /* 公式-仙魔後廚 */
		ans.push(num % radix);     /* (II) */
		num /= radix;              /* (III) */
	}
	return ans;
}

/* 2)把棧中的數字逆序放入int數組 */
int IntStack2Array(int arr[], stack<int> ans) {
	int i = 0;
	while (!ans.empty()) {
		arr[i] = ans.top();
		ans.pop();
		i++;
	}
	return i;
}

/* 3)再把int數組翻譯成轉換結果-字符串 */
void IntArray2CharArray(char str[], int arr[], int size) {
	for (int i = 0; i < size; i++) {
                /* 注意兩種情況加的數字 */
		if (arr[i] < 10)
			str[i] = arr[i] + 48;
		else
			str[i] = arr[i] + 55;
	}
}

 

當然10進制轉M進制也可以簡化成如下2步,

 


stack<int> Dec2Radix(int m, int r) {
	stack<int> s;
	if (m < 0)      
		m = -m;  // 輸出的時候別忘額外加上負號
	do {
		s.push(m % r);
		m /= r;
	} while (m);
	return s;
}

string Trans2String(stack<int> s) {
	string str = "";
	while (!s.empty()) {
		if (s.top() < 10)
			str.push_back(s.top() + 48);
		else
			str.push_back(s.top() + 55);
		s.pop();
	}
	return str;
}

 

2031 進制轉換

  • 還用說,直接後半段的倆函數,加上個main函數就完事了

 

其他

  • 由以上討論,如果想獲取m進制數的任意位,或者求任意進制數的各位之和,通式如下,
  1. 設這個數共k位,進製爲m;
  2. 設各位和爲qsum,則qsum可由下式獲得

qsum = number / m^{k-1} + number \% m^{k-1} / m^{k-2} + ... + number \% m

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章