Bootstrap

每日一题——第一百一十八题

题目:进制转换合集

#pragma once
#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
#include<string>

/// <summary>
/// 将字符串表示的任意进制数转为十进制
/// </summary>
/// <param name="str">字符串</param>
/// <param name="base">进制基数</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 c = tolower(str[i]);//先将当前字符转为小写
		int digit = -1;

		//根据字符计算对应的值
		if (c >= '0' && c <= '9') { // 计算0-9的数字
			digit = c - '0';//将数字字符转为对应的十进制数字
		}
		else if (base == 16 && (c >= 'a' && c <= 'f')) {
			digit = c - 'a' + 10;//计算大于大于9小于f的字符对应的数字
		}
		else if (c < '0' || (c > '9' && base != 16) || (base == 16 && c > 'f')) {

			return 0;//出错
		}

		//检查是否在有效范围内
		if (digit >= base) {
			return 0;
		}

		//累加结果
		result += digit * multiplier;//从低位算,第一项均为1,第二项为base^1, 第三项为base^2 , ......
		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\n");
		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 ~ Z之间的字符
		}

		num /= r;//更新num的值
	}

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


	//打印

	for (int i = index - 1; index >= 0; index--) {
		printf("%c", result[i]);
	}
	printf("\n");
}
;