n进制数转为m进制
很简单的一道作业题,也是金山一道笔试题,算法上也没多大可说的,只是勤练练手吧。
算法步骤:
1、将n进制数转换为10进制;
2、将10进制数转换为m进制;
下面是程序代码(为了模块重用写做两个函数):
当然,上面的程序并不完善,存在以下问题:
1、只能处理16进制以下的数的任意转换,这个问题易于解决,将IntToChar和ConvertCharToInt扩展几个数即可;
2、不能处理过大的数,这个问题解决起来也不太麻烦,见http://www.cnblogs.com/phinecos/archive/2009/09/11/1564975.html;
算法步骤:
1、将n进制数转换为10进制;
2、将10进制数转换为m进制;
下面是程序代码(为了模块重用写做两个函数):
#include <stdio.h>
#include "math.h"
#include "string.h"
#define NUM_LENGTH 50
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)
{
switch(ch)
{
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)
{
int ret, i;
int len = strlen(result);
ret = 0;
for(i = 0; i < len; i++)
{
ret += ConvertCharToInt(result[len - 1 - i]) * pow(origBase, i);
}
return ret;
}
void ReverseString(char *str)
{
int i, j;
char temp;
if (str == NULL)
{
return;
}
for (i = 0, j = strlen(str) - 1; i < j; i++, j--)
{
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)
{
int temp = 0, i = 0;
if (tenBaseResult == destBase)
{
return;
}
memset(result, 0, NUM_LENGTH);
while(tenBaseResult != 0)
{
temp = tenBaseResult % destBase;
tenBaseResult = tenBaseResult / destBase;
result[i] = IntToChar[temp];
i++;
}
ReverseString(result);
}
int main()
{
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");
}
#include "math.h"
#include "string.h"
#define NUM_LENGTH 50
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)
{
switch(ch)
{
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)
{
int ret, i;
int len = strlen(result);
ret = 0;
for(i = 0; i < len; i++)
{
ret += ConvertCharToInt(result[len - 1 - i]) * pow(origBase, i);
}
return ret;
}
void ReverseString(char *str)
{
int i, j;
char temp;
if (str == NULL)
{
return;
}
for (i = 0, j = strlen(str) - 1; i < j; i++, j--)
{
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)
{
int temp = 0, i = 0;
if (tenBaseResult == destBase)
{
return;
}
memset(result, 0, NUM_LENGTH);
while(tenBaseResult != 0)
{
temp = tenBaseResult % destBase;
tenBaseResult = tenBaseResult / destBase;
result[i] = IntToChar[temp];
i++;
}
ReverseString(result);
}
int main()
{
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;