m进制转换为n进制存在有公式的转化,但是这里我使用十进制作为桥梁来实现m进制到n进制的转换。但是目前只能支持非大数,以后会研究一下大数之间m进制到n进制的转换,这里先记录一下.
//
//
// 非大数之间的进制转换
//
// m进制转换为n进制
// 2<= m <= 16
// 2<= n <= 16
//
//
/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
// 将m进制数转换为10进制数
void mRadixToDecimal( char * mRadix , int M , int * number )
{
int length = strlen( mRadix ) ;
*number = 0 ;
int j = 0 ;
for( int i = length - 1 ; i >= 0 ; i-- )
{
*number += int( mRadix[i] - 48 ) * pow( M , j++ ) ;
}
}
// 字符串逆置函数
void strReverse( char * str )
{
int length = strlen( str ) ;
char tmp ;
for( int i = 0 ; i < length ; i++ )
{
tmp = str[i] ;
str[i] = str[length - i - 1 ] ;
str[length - i - 1 ] = tmp ;
}
}
// 将十进制数转化为n进制数
void decimalTonRadix( int number , int N , char * nRadix )
{
int i = 0 ;
int quotient = number ; // 商
int remainder ; // 余数
while( 1 )
{
remainder = quotient % N ;
quotient /= N ;
if( remainder < 10 )
{
nRadix[i++] = char ( remainder + 48 ) ;
}
else
{
nRadix[i++] = char( remainder - 10 + 65 ) ;
}
if( quotient == 0 )
{
break ;
}
}
nRadix[i] = '\0' ;
strReverse( nRadix ) ; // 逆置字符串
}
int main()
{
char mRadix[50] ;
char nRadix[50] ;
int M ;
int N ;
int number ;
printf("M进制的数:" ) ;
scanf("%s" , mRadix ) ;
printf("进制M:") ;
scanf("%d" , &M ) ;
printf("要转换为的进制:\n") ;
scanf("%d" , &N ) ;
// 将m进制转换为十进制
mRadixToDecimal( mRadix , M , &number ) ;
// 将十进制转换为n进制
decimalTonRadix( number , N , nRadix ) ;
printf("%s\n" , nRadix ) ;
return 0 ;
}