n进制数转为m进制

很简单的一道作业题,也是金山一道笔试题,算法上也没多大可说的,只是勤练练手吧。
算法步骤:
1、将n进制数转换为10进制;
2、将10进制数转换为m进制;
下面是程序代码(为了模块重用写做两个函数):
#include  < stdio.h >
#include 
" math.h "
#include 
" string.h "

#define  NUM_LENGTH    50

ExpandedBlockStart.gifContractedBlock.gif
char  IntToChar[]  =   {'0''1''2''3''4''5''6''7''8''9''A''B''C''D''E''F'} ;

//  Convert a char to integer ,like: F = 15
int  ConvertCharToInt( char  ch)
ExpandedBlockStart.gifContractedBlock.gif
{
    
switch(ch)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
case '0':
            
return 0;
        
case '1':
            
return 1;
        
case '2':
            
return 2;
        
case '3':
            
return 3;
        
case '4':
            
return 4;
        
case '5':
            
return 5;
        
case '6':
            
return 6;
        
case '7':
            
return 7;
        
case '8':
            
return 8;
        
case '9':
            
return 9;
        
case 'A':
            
return 10;
        
case 'B':
            
return 11;
        
case 'C':
            
return 12;
        
case 'D':
            
return 13;
        
case 'E':
            
return 14;
        
case 'F':
            
return 15;
        
default:
            
return -1;
    }

}


//  Convert A x-base number to tenbase
int  ConvertToTenBase( const   char   * result,  int  origBase)
ExpandedBlockStart.gifContractedBlock.gif
{
    
int ret, i;
    
int len = strlen(result);
    
    ret 
= 0;
    
for(i = 0; i < len; i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        ret 
+= ConvertCharToInt(result[len - 1 - i]) * pow(origBase, i);
    }

    
return ret;
}


void  ReverseString( char   * str)
ExpandedBlockStart.gifContractedBlock.gif
{
    
int i, j;
    
char temp;

    
if (str == NULL)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
return;
    }


    
for (i = 0, j = strlen(str) - 1; i <  j; i++, j--)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        temp 
= str[i];
        str[i] 
= str[j];
        str[j] 
= temp;
    }

}


//  Convert A Tenbase integer to dest base
void  ConvertToDestBase( char   * result,  int  tenBaseResult,  int  destBase)
ExpandedBlockStart.gifContractedBlock.gif
{
    
int temp = 0, i = 0;
    
if (tenBaseResult == destBase)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
return;
    }

    memset(result, 
0, NUM_LENGTH);

    
while(tenBaseResult != 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        temp 
= tenBaseResult % destBase;
        tenBaseResult 
= tenBaseResult / destBase;
        result[i] 
= IntToChar[temp];
        i
++;
    }

    ReverseString(result);
}


int  main()
ExpandedBlockStart.gifContractedBlock.gif
{
    
char result[NUM_LENGTH];
    
int origBase;
    
int destBase;
    
int tenbaseResult;
    
    
// Input: number origBase destbase
    scanf("%s%d%d", result, &origBase, &destBase);
    
    
// Convert To Ten Base
    tenbaseResult = ConvertToTenBase(result, origBase);
    
    
// Convert to dest Base
    ConvertToDestBase(result, tenbaseResult, destBase);
    
    printf(
"%s\n", result);
    
    system(
"pause");
}


当然,上面的程序并不完善,存在以下问题:
1、只能处理16进制以下的数的任意转换,这个问题易于解决,将IntToChar和ConvertCharToInt扩展几个数即可;
2、不能处理过大的数,这个问题解决起来也不太麻烦,见 http://www.cnblogs.com/phinecos/archive/2009/09/11/1564975.html

转载于:https://www.cnblogs.com/EricYang/archive/2009/09/14/1566473.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值