#include <stdio.h>
#define MAX_STR_LEN 17
int main()
{
char hex[MAX_STR_LEN];
long long octal, bin, place;
int i = 0, rem, val;
/*用户输入十六进制数*/
printf("Enter any hexadecimal number: ");
fgets(hex, MAX_STR_LEN, stdin);
octal = 0ll;
bin = 0ll;
place = 0ll;
/*十六进制--->二进制*/
for (i = 0; hex[i] != '\n'; i++)
{
bin = bin * place;
switch (hex[i])
{
case '0':
bin += 0;
break;
case '1':
bin += 1;
break;
case '2':
bin += 10;
break;
case '3':
bin += 11;
break;
case '4':
bin += 100;
break;
case '5':
bin += 101;
break;
case '6':
bin += 110;
break;
case '7':
bin += 111;
break;
case '8':
bin += 1000;
break;
case '9':
bin += 1001;
break;
case 'a':
case 'A':
bin += 1010;
break;
case 'b':
case 'B':
bin += 1011;
break;
case 'c':
case 'C':
bin += 1100;
break;
case 'd':
case 'D':
bin += 1101;
break;
case 'e':
case 'E':
bin += 1110;
break;
case 'f':
case 'F':
bin += 1111;
break;
default:
printf("Invalid hexadecimal input.");
break;
}
place = 10000;
}
place = 1;
/*二进制--->八进制*/
while (bin > 0)
{
rem = bin % 1000;
switch (rem)
{
case 0:
val = 0;
break;
case 1:
val = 1;
break;
case 10:
val = 2;
break;
case 11:
val = 3;
break;
case 100:
val = 4;
break;
case 101:
val = 5;
break;
case 110:
val = 6;
break;
case 111:
val = 7;
break;
}
octal = (val * place) + octal;
bin /= 1000;
place *= 10;
}
printf("Hexadecimal number = %s\n", hex);
printf("Octal number = %lld", octal);
return 0;
}
测试结果:
Enter any hexadecimal number: acb
hex[0]:a
hex[1]:c
hex[2]:b
Hexadecimal number = acb
Octal number = 5313
#include <stdio.h>
#include <string.h>
const char *hex_to_oct(const char *hex)
{
#define MAX_OCT_STR_LEN 23
static char octal[MAX_OCT_STR_LEN];
memset(octal, '\0', MAX_OCT_STR_LEN);
unsigned long long decimal = 0;
int i = 0;
int len;
if (hex == NULL)
{
return octal;
}
/*十六进制--->十进制*/
while (*hex != '\n' && *hex != '\0')
{
char ch = *hex;
if (ch >= '0' && ch <= '9')
{
ch -= '0';
}
else if (ch >= 'a' && ch <= 'f')
{
ch = ch - 'a' + 10;
}
else if (ch >= 'A' && ch <= 'F')
{
ch = ch - 'A' + 10;
}
else
{
printf("Invalid hexadecimal input: %c\n", ch);
break;
}
decimal *= 16;
decimal += ch;
hex++;
}
/*十进制--->八进制*/
if (decimal == 0)
{
octal[0] = '0';
len = 1;
}
else
{
i = 0;
while (decimal > 0)
{
octal[i] = '0' + decimal % 8;
i++;
decimal /= 8;
}
len = i;
}
octal[len] = '\0';
/*转换八进制字符串*/
for (i = 0; i < len / 2; i++)
{
char tmp = octal[i];
octal[i] = octal[len - i - 1];
octal[len - i - 1] = tmp;
}
return octal;
}
int main()
{
#define MAX_HEX_STR_LEN 17
char hex[MAX_HEX_STR_LEN];
/*输入十六进制数*/
printf("Enter any hexadecimal number: ");
fgets(hex, MAX_HEX_STR_LEN, stdin);
const char *octal = hex_to_oct(hex);
printf("Hexadecimal number = %s\n", hex);
printf("Octal number = %s\n", octal);
return 0;
}
测试结果:
Enter any hexadecimal number: acb
Hexadecimal number = acb
Octal number = 5313
【欢迎关注编码小哥,学习更多实用的编程方法】