顺序栈实现任意进制转换

思路分析

我们都熟悉任意进制和十进制之间的转换,任意进制的转换的思路就是以十进制为桥梁,先把数字转成十进制,再把十进制转成目的进制。
任意进制转十进制,比如:45(8),转成十进制,其 result = 4x81+5x80 = 32+5 = 37;我们可以通过循环加来实现。
十进制转任意进制,比如55,转成八进制,需要利用短除法,如下图
顺序栈实现任意进制转换先除的余数反而放在低位,这种先进后出的关系和栈十分相似,我们可以利用栈实现。

主要代码

int HexAnyToTen(char * num,int hex_begin){
	int i = 0,j = 0,k = 1;
	int counter = 0;
	int prior = 0;
	int length = strlen(num);
	printf("%d",length);
	for(i=0;i < length; i++)
	{
		k = 1;
		for(j=0;j<length-1-i;j++)
		{
			k *= hex_begin;
		}
		if(num[i] >= 48&&num[i] <= 57)
		{
			counter += (num[i] - '0')*k;
			prior = num[i] - '0';
		}
		else if(num[i] >= 65&&num[i] <= 90){
			counter += (num[i] - 55)*k;
			prior = num[i] - 55;
		}
		else if(num[i] >= 97&&num[i] <= 122){
			counter += (num[i] - 87)*k;
			prior = num[i] - 87;
		}
		else{
			if(i==0){
				continue;
			}
			else{
				counter = counter - prior*k*(hex_begin -1);
			}
		}
	}
	printf("%d\n",counter);
	return counter;
}

// 十进制转任意进制
void    HexToTenToAny(int num_hex_ten,int hex_after)
{
	SeqStack * s;
	int x;
	s = initSeqStack();
	while( num_hex_ten )
	{
		push(s, num_hex_ten % hex_after);
		num_hex_ten /= hex_after;
	}

	printf("转换成目的进制后:");

	while(!isEmpty(s))
	{
		x = getTop(s);
		pop(s);
		if(x > 9){
			printf("%c",x+87);
		}
		else{
			printf("%d",x);
		}
	}

	printf("\n");
}

Sample input

87475    // 待转换的数字
16			//待转换数字的进制
8				//目的进制

Sample output

转换成目的进制后:554101

所有代码

月小水长的 Github

其中还涉及到一些异常的处理的逻辑,不懂的地方欢迎提问。