题目:进制转换合集。任意r进制与十进制之间的转换
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
long stringToDecimal ( const char * str, int base) ;
void convertToBaseR ( int num, int r) ;
int main ( ) {
char hexStr[ ] = "1A3F" ;
char octStr[ ] = "123" ;
char binStr[ ] = "101010" ;
printf ( "十六进制转换成十进制为: %ld\n" , stringToDecimal ( hexStr, 16 ) ) ;
printf ( "八进制转换成十进制为: %ld\n" , stringToDecimal ( octStr, 8 ) ) ;
printf ( "二进制转换成十进制为: %ld\n" , stringToDecimal ( binStr, 2 ) ) ;
int num, r;
printf ( "请输入十进制的整数: " ) ;
scanf_s ( "%d" , & num) ;
printf ( "请输入要转化的进制数: " ) ;
scanf_s ( "%d" , & r) ;
convertToBaseR ( num, r) ;
return 0 ;
}
long stringToDecimal ( const char * str, int base) {
long result = 0 ;
int multiplier = 1 ;
int length = strlen ( str) ;
for ( int i = length - 1 ; i >= 0 ; i-- )
{
char ch = tolower ( str[ i] ) ;
int digit = - 1 ;
if ( ch >= '0' && ch <= '9' )
{
digit = ch - '0' ;
}
else if ( base == 16 && ( ch >= 'a' && ch <= 'f' ) )
{
digit = ch - 'a' + 10 ;
}
else if ( ch < '0' || ( ch > '9' && base != 16 ) || ( base == 16 ) && ch > 'f' )
{
return 0 ;
}
if ( digit >= base) {
return 0 ;
}
result += digit * multiplier;
multiplier *= base;
}
}
void convertToBaseR ( int num, int r) {
int index = 0 ;
char result[ 65 ] ;
if ( num == 0 ) {
printf ( "0\n" ) ;
return ;
}
while ( num > 0 )
{
int remainder = num % r;
if ( remainder < 10 ) {
result[ index++ ] = '0' + remainder;
}
else
{
result[ index++ ] = 'A' + ( remainder - 10 ) ;
}
num = num / r;
}
result[ index] = '\0' ;
for ( int i = index; i >= 0 ; i-- )
{
printf ( "%c" , result[ i] ) ;
}
printf ( "\n" ) ;
}