#include <stdio.h> #include <stdlib.h> #include <string.h> /** * 总体思想:采用一个数组存放基数"0123456789ABCDEF" * 即数字的每一位由上述数组的元素组成 * 如一个数表示为"15F",则该数字实际为:1 5 15 * 这样的话处理进制转换问题就和大整数运算问题一样了。 */ //将数字转换为字符串形式 int N2Str(int value,int N,char *str) { char temp[10],*Bits="0123456789ABCDEF"; int Len; if(value<0||N<2||N>16||str==NULL) return 0; if(value>=N) {//递归按位转换 if(!N2Str(value/N,N,str)) return 0; } Len=strlen(str); str[Len]=Bits[value%N]; str[Len+1]='\0'; return 1; } //M进制转换为N进制 int M2N(int M,char *MStr,int N,char *NStr) { int value=0,bit; if(M<2||M>16||MStr==NULL||N<2||N>16||NStr==NULL) return 0; while(*MStr) {//该过程类似于大整数运算的运算进位减位问题 value*=M; if(*MStr>='0'&&*MStr<='9') bit=*MStr-'0'; else if(*MStr>='a'&&*MStr<='f') bit=*MStr-'a'+10; else if(*MStr>='A'&&*MStr<='F') bit=*MStr-'A'+10; if(bit>=M) return 0; value+=bit; MStr++; } *NStr='\0'; N2Str(value,N,NStr); return 1; } int main(void) { char *in="123456"; char out[50]; if(M2N(8,in,16,out)) printf("%s->%s\n",in,out); else printf("illegal input data\n"); system("pause"); return 0; }