每日一题——第一百二十四题

题目:进制转换

c 复制代码
#pragma once

#include<stdio.h>
#include<ctype.h>
#include<string.h>


/// <summary>
/// //将字符串表示的任意进制数转为十进制
/// </summary>
/// <param name="str">字符串</param>
/// <param name="base">当前进制数2、8、16</param>
/// <returns></returns>
long stringToDecimal(const char* str, int base)
{
	long result = 0;
	int multiplier = 1;
	int len = strlen(str);

	//从字符串末尾开始解析
	for (int i = len - 1; i >= 0; i--)
	{
		char ch = tolower(str[i]);//将字符转换为小写
		int digit = -1;

		if (ch >= '0' && ch <= '9')
		{
			digit = ch - '0';//将字符转为对应的数字
		}
		else if (base == 16 && (ch >= 'a' && ch <= 'f'))
		{
			digit = ch - 'a' + 10;
		}
		else if(ch < '0' || (ch > '9' && base != 16) || (base == 16 && ch > 'f'))//错误的情况
		{
			return 0;
		}

		//检查进制数是否在有效范围内
		if (digit >= base)
		{
			return 0;//非法字符
		}

		//累加结果
		result += digit * multiplier;
		multiplier *= base;
	}

	return result;

}


/// <summary>
/// 将十进制数转为任意的r进制数
/// </summary>
/// <param name="num"></param>
/// <param name="r"></param>
void ConvertToBaseR(int num, int r)
{
	int index = 0;
	char result[65];//假设转换后的数不超过64位

	//处理num为0的情况
	if (num == 0)
	{
		printf("0");
		return;
	}

	while (num > 0)
	{
		int remainder = num % r;//获取最后一位数字
		if (remainder < 10)
		{
			result[index++] = '0' + remainder;//余数小于10的数字, 将其转换成0~9之间的字符
		}
		else
		{
			result[index++] = 'A' + (remainder + 10);//余数大于等于10的数字, 将其转换成A ~ F之间的字符
		}

		num /= r;//更新下一次计算的数字num
	}

	result[index] = '\0';//在字符串末尾添加字符串结束符

	//由于是从低位到高位存, 所以反向打印
	for (int i = index - 1; i >= 0; i--)
	{
		printf("%c", result[i]);
	}
	printf("\n");
}
相关推荐
昌原的儿子LEO2 小时前
Linux进程知识点总结
linux·服务器·c语言·数据库
多弗朗皮卡丘5 小时前
C语言梦开始的地方16:结构体
c语言·开发语言·windows
2401_862880825 小时前
Linux应用层开发 --- 多任务
linux·服务器·c语言
心仪久了会沦陷6 小时前
数据结构入门系列——顺序表详解:概念、分类与动态实现
c语言·数据结构·经验分享·笔记·开源
witton6 小时前
xmake中将proto文件生成C/C++文件然后再编译链接进项目
c语言·c++·mingw·protobuf·xmake·protobuf-c·protoc-gen-c
dear_bi_MyOnly6 小时前
C语言控制语句与循环逻辑精讲
c语言·开发语言·学习·分类
M78佐菲17 小时前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
wWYy.18 小时前
C++与C的区别
c语言·c++
LuminousCPP19 小时前
数据结构‑二叉树(二):二叉堆从零实现|Heap结构设计 + 建堆优化 + 堆排序深度解析
c语言·数据结构·笔记·二叉树
程序员与背包客_CoderZ1 天前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb