C语言实现任意进制间数的转换

这是我的第一篇博客,有写的不好的地方,还请多多担待~
因为要转化的原始值位数是不固定的,在输入要转化的值方面可能会有点麻烦。 与其他博主通过 声明数组+strlen函数 的方式不同,这里提供了另一种的思路:利用改进后的getche函数,每输入一个值都会判断/计算一次,比如:原进制为8,要转换的值为12,用户输入1后全局变量sum被赋值为1×1,再输入一个2,全局变量sum被赋值为1×1×8+2×1;再利用sum作媒介转换成目标进制下的值。

这样做的一个好处在于不需要数组。在这里插入图片描述

我是用VS写的,用其他编译器的话需要将scanf_s改为scanf

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int sum = 0;
int recording;
int main()
{
	system("color F0");
	system("title 进制转换");
	int input1, input2, input3;
	int inputA(); int inputB();//输入与判断函数
	void BasicA(int input1); int BasicB(int sum, int input2);//基础函数A、B
	while (1)
	{
		//第一部分:进制的输入与判断	
		input1 = inputA();
		input2 = inputB();
		//第二部分:包括特殊进制的使用,其中设定基础函数A:其它进制转化为十进制;基础函数B:十进制转换为其它进制;
		if (input1 == 10)
		{
			printf("请输入原值:");
			scanf_s("%d", &input3);
			BasicB(input3, input2);//直接启动基础函数B
		}
		else if (input2 == 10)
		{
			BasicA(input1);//直接启动基础函数A
			if (sum!=0)
			printf("\n十进制值:%d\n", sum);
		}
		else
			//第三部分:非特殊进制的转换/输出结果
		{
			BasicA(input1);
			BasicB(sum, input2);
		}
		printf("\n");
		system("pause");
		printf("\n");
	}
	return 0;
}
//输入与判断函数
int inputA()
{
	int input;
	printf("原进制 :");
	scanf_s("%d", &input);
	if ((input >= 2) && (input <= 16))
		return input;
	else
	{
		printf("输入的进制不在可计算范围内,请重新输入.\n");
		return input = inputA();
	}
}
int inputB()
{
	int input;
	printf("目标进制:");
	scanf_s("%d", &input);
	if ((input >= 2) && (input <= 16))
		return input;
	else
	{
		printf("输入的进制不在可计算范围内,请重新输入.\n");
		return input = inputB();
	}
}
//基础函数A
void BasicA(int input1)
{
	int n=49, x = 0;  char l[50]; int L ; 
	sum = 0; 
	printf("请输入原值:");
	while (n)
	{
		l[n] = getche();
		if (l[n] == 8)//backspace
		{
			sum = (sum - recording) / input1;
			x = x - 1;
		}
		else if (l[n] == 13)//确认键
		{
			printf("\n");
			n = 0;
	    }
		else
		{
			if ((l[n] >= 65) && (l[n] <= 70))//输入为A~F
				L = l[n] - 55;
			else if ((l[n] >= 97) && (l[n] <= 102)) //输入为a~f
				L = l[n] - 87;
			else if ((l[n] >= 48) && (l[n] <= 57)) //输入为数字
                L = l[n]-48;
			else 
			{
				printf("\nWrong input\n\n请重新输入:");
				sum = 0; x = 0; 
		    }
			if (L >= input1)//如果输入值大于该进制值
			{
				printf("\nWrong input\n\n请重新输入:");
				sum = 0; x = 0;
			}
			if (x != 0)
			{
				recording = L;
				sum = L + sum * input1;
				x++;
				n--;
			}
		}
	}
	printf("输入数值位数:%d\n", x);
}
//基础函数B
int BasicB(int sum0, int input2)//要求传入目标进制与得出后的十进制值
{
	int i = 1, c = 0,d;
	printf("结果为:");
	if (sum0 < 0) sum0 = -sum0;//待修改
	if (sum0 == 0) printf("0\n");
	else
	{
		if (input2 <= 10)
		{
			while (sum0 != 0)
			{
				c = c + (sum0 - sum0 / input2 * input2) * i;
				i = i * 10;
				sum0 = sum0 / input2;
			}
			printf("%d\n", c);
		}
		else
		{
			while (sum0 >= input2)
			{
				d = sum0;
				i = 0;
				while (d >= input2)
				{
					d = d / input2;
					i++;
				}
				if (d <= 9)
					printf("%d", d);
				else 
				    printf("%c", (char)(d + 87));
				sum0 = sum0 - (unsigned int)pow(input2, i) * d;
			}
			if (sum0 <= 9)
				printf("%d", sum0);
			else if (sum0 <= 35)
				printf("%c", (char)(sum0 + 87));
		}
	}
	printf("\n\n");
	return 0;
}

理论上它能在任意进制间实现转换,但常用的一般在16以内,所以设定最大为16进制,可以自己定义并修改

如果有可以改进的地方还希望各位大佬提出来~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个实现任意进制互相转换的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> // 将一个任意进制转换为十进制数 int anyBaseToDecimal(char* num, int base) { int result = 0; int i = 0; int len = strlen(num); // 按权展开法 for (i = 0; i < len; i++) { int digit; if (num[i] >= '0' && num[i] <= '9') { digit = num[i] - '0'; } else if (num[i] >= 'A' && num[i] <= 'Z') { digit = num[i] - 'A' + 10; // A~Z表示的数字 } else { printf("Invalid input!\n"); // 非法输入 return 0; } result = result * base + digit; } return result; } // 将一个进制转换任意进制数 char* decimalToAnyBase(int num, int base) { int quotient = num; int remainder; char* result = (char*) malloc(32 * sizeof(char)); // 分配足够的内存空,最多支持32位进制数 char* buffer = (char*) malloc(32 * sizeof(char)); int i = 0; // 除基取余法 while (quotient != 0) { remainder = quotient % base; quotient = quotient / base; if (remainder < 10) { buffer[i++] = remainder + '0'; } else { buffer[i++] = remainder - 10 + 'A'; // 大于等于10时,使用A~Z表示 } } int j = 0; // 反转字符串 for (j = 0; j < i; j++) { result[j] = buffer[i-j-1]; } result[j] = '\0'; // 字符串结尾需要加上'\0' free(buffer); // 释放内存空 return result; } // 将一个任意进制转换为另一个任意进制数 char* anyBaseToAnyBase(char* num, int from, int to) { int decimal = anyBaseToDecimal(num, from); // 先将任意进制转换为十进制数 char* result = decimalToAnyBase(decimal, to); // 再将十进制转换为目标进制数 return result; } int main() { char* num = "12345"; int from = 10; // 数字是10进制 int to = 16; // 转换为16进制 char* result = anyBaseToAnyBase(num, from, to); printf("%s in base %d: %s in base %d\n", num, from, result, to); free(result); // 释放内存空 return 0; } ``` 以上代码可以将一个任意进制转换为另一个任意进制数。你可以根据自己的需要来修改进制数和测试数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值