进制转换问题求解

 

#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;
}
posted @ 2012-10-07 11:18  涵曦  阅读(414)  评论(0编辑  收藏  举报