解题思路
这是一道进制转换题目,主要思路如下:
-
问题分析:
- 输入一个十进制数
- 输入目标进制
(
)
- 需要处理负数情况
- 需要处理16进制的字母表示
- 输入一个十进制数
-
解决方案:
- 使用除N取余法
- 倒序保存余数
- 处理负数符号
- 使用字符数组映射16进制
-
实现细节:
- 特判0的情况
- 处理负数
- 使用字符数组表示大于9的数字
代码
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
int m, n;
// 16进制字符映射表
char digits[] = {'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
cin >> m >> n;
// 处理0的特殊情况
if(m == 0) {
cout << "0" << endl;
return 0;
}
// 处理负数
string result;
bool isNegative = m < 0;
m = abs(m);
// 进制转换
while(m > 0) {
result += digits[m % n];
m /= n;
}
// 添加负号
if(isNegative) {
result += '-';
}
// 反转字符串
reverse(result.begin(), result.end());
cout << result << endl;
return 0;
}
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
// 16进制字符映射表
char[] digits = {'0','1','2','3','4','5','6','7',
'8','9','A','B','C','D','E','F'};
// 处理0的特殊情况
if(m == 0) {
System.out.println("0");
return;
}
// 处理负数
StringBuilder result = new StringBuilder();
boolean isNegative = m < 0;
m = Math.abs(m);
// 进制转换
while(m > 0) {
result.append(digits[m % n]);
m /= n;
}
// 添加负号
if(isNegative) {
result.append('-');
}
// 反转字符串
System.out.println(result.reverse().toString());
}
}
def convert_base(m: int, n: int) -> str:
# 16进制字符映射表
digits = '0123456789ABCDEF'
# 处理0的特殊情况
if m == 0:
return '0'
# 处理负数
is_negative = m < 0
m = abs(m)
result = []
# 进制转换
while m:
result.append(digits[m % n])
m //= n
# 添加负号
if is_negative:
result.append('-')
# 反转并连接
return ''.join(result[::-1])
def main():
m, n = map(int, input().split())
print(convert_base(m, n))
if __name__ == "__main__":
main()
算法及复杂度
- 算法:数学(进制转换)
- 时间复杂度:
-
为输入数字,
为目标进制
- 空间复杂度:
- 存储结果字符串