题目:进制转换
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");
}