题目描述
求任意两个不同进制非负整数的转换(2 进制 ∼ 16 进制),所给整数在 int 范围内。
不同进制的表示符号为(0,1,…,9,a,b,…,f)或者(0,1,…,9,A,B,…,F)
输入格式
输入只有一行,包含三个整数 a,n,b。a 表示其后的 n 是 a 进制整数,b 表示欲将 a 进制整数 n 转换成 b 进制整数。
a,b 是十进制整数。
数据可能存在包含前导零的情况。
输出格式
输出包含一行,该行有一个整数为转换后的 b 进制数。
输出时字母符号全部用大写表示,即(0,1,…,9,A,B,…,F)。
数据范围
2≤a,b≤16,
给定的 a 进制整数 n 在十进制下的取值范围是 [1,2147483647]。
样例
输入样例:
15 Aab3 7
输出样例:
210306
算法1
(模拟) $O(n)$
时间复杂度
参考文献
python3 代码
def ctoi(c: chr) -> int:
if c <= '9':
return ord(c) - ord('0')
elif c <= 'Z':
return ord(c) - ord('A') + 10
return ord(c) - ord('a') + 10
def itoc(x: int) -> chr:
if x <= 9:
return chr(ord('0') + x)
return chr(ord('A') + x - 10)
def main():
line = input().split()
a = int(line[0])
s = line[1]
b = int(line[2])
x = 0
for c in s:
x = x * a + ctoi(c)
res = []
while x != 0:
tmp = x % b
x //= b
res.append(itoc(tmp))
res = res[::-1]
print(''.join(res))
if __name__ == '__main__':
main()
C++ 代码
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
int ctoi(char c)
{
if (c <= '9')
{
return (int)(c - '0');
}
else if (c <= 'Z')
{
return (int)(c - 'A' + 10);
}
return (int)(c - 'a' + 10);
}
char itoc(int x)
{
if (x < 10)
{
return (char)('0' + x);
}
return (char)('A' + x - 10);
}
int main()
{
std::ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int a; cin >> a;
string s; cin >> s;
int b; cin >> b;
int x = 0;
for (char c: s)
{
x = x * a + ctoi(c);
}
string res = "";
while (x != 0)
{
int tmp = x % b;
char c = itoc(tmp);
res.push_back(c);
x /= b;
}
reverse(res.begin(), res.end());
cout << res << endl;
return 0;
}
java 代码
import java.util.Scanner;
public class Main
{
static char itoc(int x)
{
if (x < 10)
{
return (char)('0' + x);
}
return (char)('A' + x - 10);
}
static int ctoi(char c)
{
if (c <= '9')
{
return (int)(c - '0');
}
else if (c <= 'Z')
{
return (int)(c - 'A' + 10);
}
return (int)(c - 'a' + 10);
}
public static void main(String [] args) throws Exception
{
Scanner scan = new Scanner(System.in);
int a = scan.nextInt();
String s = scan.next();
int b = scan.nextInt();
int x = 0;
for (int i = 0; i < s.length(); i ++)
{
char c = s.charAt(i);
x = x * a + ctoi(c);
}
StringBuilder SB = new StringBuilder();
while (x != 0)
{
int tmp = x % b;
x /= b;
char c = itoc(tmp);
SB.append(c);
}
SB.reverse();
String res = SB.toString();
System.out.println(res);
}
}
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla