题目需求:
编写一个程序,实现二进制、八进制、十进制、十六进制的相互转换。 提示:输入的数值后面的字母表示进制数,56D便是十进制的56,72O便是八进制的72,ACH便是十六进制的AC。 示例
输入:56D
输出:HEX[38]
DEC[56]
OCT[70]
BIN[00111000]
输入:ACH
输出:HEX[AC]
DEC[172]
OCT[254]
BIN[10101100]
输入:72Q
输出:HEX[3A]
DEC[58]
OCT[72]
BIN[00111010]
输入:00011010B
输出:HEX[1A]
DEC[26]
OCT[32]
BIN[00011010]
程序设计
这里的输入数据并非真实的进制数,输入采用的是字符串的形式。例如:二进制“11001010B”,八进制“26Q”,十进制“56D”,十六进制“7CH”。在进制数后面加上进制数标识符以便区分。 通过Funtion(char* array,int len)函数求得的数是10进制数,也就是int型数据。形参array是要传入的进制字符串数据,也就是上面提到的诸如“11001010B”这种风格的进制数,形参len则是字符串长度。 DecToAny(int n, int m)函数则是十进制数转任意进制数,形参n为输入的数据,形参m为要转成m进制的意思。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int Funtion(char *array,int len)
{
int sum=0;
switch (array[len-1])
{
case B://2进制转10进制
{
for (int i = len - 2; i >= 0; i--)
{
sum += (array[i]-0) * pow(2, len - i - 2);
}
break;
}
case Q://8进制转10进制
{
for (int i = len - 2; i >= 0; i--)
sum += (array[i] - 0)*pow(8, len - i - 2);
break;
}
case D://将字符串型的数转成int型十进制数
{
for (int i = 0; i < len-1; i++)
sum += (array[i] - 0)*pow(10, len - i - 2);
break;
}
case H://16进制转10进制
{
for (int i = len - 2; i >= 0; i--)
{
if (array[i] > 47 && array[i] < 58) //0~9
sum += (array[i] - 48)*pow(16, len - i - 2);
else if (array[i] > 64 && array[i] < 71) //A~F
sum += (array[i] - 55)*pow(16, len - i - 2);
else if (array[i] > 96 && array[i] < 103) //a~f
sum += (array[i] - 87)*pow(16, len - i - 2);
}
break;
}
default:break;
}
return sum;
}
int DecToAny(int n, int m)// n表示数据,m表示要转成m进制
{
if (n < m) return n;
else return DecToAny(n / m, m) * 10 + n % m;
}
int main(void)
{
int Length;//数组长度
int s;
char *Data = (char*)malloc(9 * sizeof(char));//数据字符串数组
gets(Data);//输入数据
Length = strlen(Data);
s=Funtion(Data,Length);//功能函数
printf("HEX[%X]
DEC[%d]
OCT[%o]
BIN[%d]
",s,s,s,DecToAny(s,2));
}
运行结果