C语言实现进制转换---十六进制转换十进制、十六进制转换八进制

这里写目录标题

  • 十六进制转换十进制
  • 十六进制转换八进制


十六进制转换十进制

问题描述
  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
65535

代码实现:

#include 
#include 
int main()
{
	char arr[9] = { 0 };
	int i = 0;
	unsigned int b = 0;
	int n = 1;
	scanf("%s", arr);
	for (i = strlen(arr) - 1; i >= 0; i--)
	{
		if (arr[i] <= '9')
		{
			b += (arr[i] - '0') * n;
		}
		else
		{
			b += (arr[i] - 'A' + 10) * n;
		}
		n *= 16;
	}
	printf("%u\n", b);
	return 0;
}

十六进制转换八进制

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0 ~ 9、大写字母A ~ F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
  输出n行,每行为输入对应的八进制正整数。
注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。
  
代码实现:

#include 
#include 
#include 
#define MaxSize 100000
void saveB(char* a2, char c1, char c2, char c3, char c4, int start)
{
	a2[start] = c1;
	a2[start + 1] = c2;
	a2[start + 2] = c3;
	a2[start + 3] = c4;
}
int btran(char* a1, char* a2)
{
	int i = 0;
	int j = 0;
	int h1 = strlen(a1);
	for (i = 0; i < h1; i++)
	{
		switch (a1[i])
		{
		case'0':
		{
			saveB(a2, '0', '0', '0', '0', 4 * i);
			break;
		}
		case'1':
		{
			saveB(a2, '0', '0', '0', '1', 4 * i);
			break;
		}
		case'2':
		{
			saveB(a2, '0', '0', '1', '0', 4 * i);
			break;
		}
		case'3':
		{
			saveB(a2, '0', '0', '1', '1', 4 * i);
			break;
		}
		case'4':
		{
			saveB(a2, '0', '1', '0', '0', 4 * i);
			break;
		}
		case'5':
		{
			saveB(a2, '0', '1', '0', '1', 4 * i);
			break;
		}
		case'6':
		{
			saveB(a2, '0', '1', '1', '0', 4 * i);
			break;
		}
		case'7':
		{
			saveB(a2, '0', '1', '1', '1', 4 * i);
			break;
		}
		case'8':
		{
			saveB(a2, '1', '0', '0', '0', 4 * i);
			break;
		}
		case'9':
		{
			saveB(a2, '1', '0', '0', '1', 4 * i);
			break;
		}
		case'A':
		{
			saveB(a2, '1', '0', '1', '0', 4 * i);
			break;
		}
		case'B':
		{
			saveB(a2, '1', '0', '1', '1', 4 * i);
			break;
		}
		case'C':
		{
			saveB(a2, '1', '1', '0', '0', 4 * i);
			break;
		}
		case'D':
		{
			saveB(a2, '1', '1', '0', '1', 4 * i);
			break;
		}
		case'E':
		{
			saveB(a2, '1', '1', '1', '0', 4 * i);
			break;
		}
		case'F':
		{
			saveB(a2, '1', '1', '1', '1', 4 * i);
			break;
		}
		default:
			break;
		}
	}
	return 4 * h1;
}
int otran(char* a2, char* a3, int bl)
{
	int i = 0;
	int j = 0;
	int ol = 0;
	if (bl % 3 == 0)
	{
		ol = bl / 3;
	}
	else
	{
		ol = bl / 3 + 1;
	}
	j = bl - 1;
	for (i = ol - 1; i >= 0; i--)
	{
		if (i > 0)
		{
			a3[i] = a2[j] - 48 + (a2[j - 1] - 48) * 2 + (a2[j - 2] - 48) * 4 + 48;
		}
		else
		{
			switch (j)
			{
			case 2:
				a3[i] = a2[j] - 48 + (a2[j - 1] - 48) * 2 + (a2[j - 2] - 48) * 4 + 48;
				break;
			case 1:
				a3[i] = a2[j] - 48 + (a2[j - 1] - 48) * 2 + 48;
				break;
			case 0:
				a3[i] = a2[j];
				break;
			default:
				break;
			}
		}
		j = j - 3;
	}
	return ol;
}
void print(char* a3, int ol)
{
	int i = 0;
	if (a3[0] == '0')
	{
		i = 1;
	}
	for (; i < ol; i++)
	{
		printf("%c", a3[i]);
	}
	printf("\n");
}
int main()
{
	char arr1[MaxSize];
	char arr2[4 * MaxSize];
	char arr3[4 * MaxSize];
	int n = 0;
	int i = 0;
	int bl = 0;
	int ol = 0;
	scanf("%d", &n);
	getchar();
	for (i = 0; i < n; i++)
	{
		gets(arr1);
		bl = btran(arr1, arr2);
		ol = otran(arr2, arr3, bl);
		print(arr3, ol);
	}
	return 0;
}

你可能感兴趣的:(c语言,算法,c++)