10进制转b进制
b进制转10进制
private static int uget(char c) {
if (c <= '9') return c - '0';
return c - 'A' + 10;
}
private static int base10(String num, int b) {
int res = 0;
for (char c : num.toCharArray()) {
res = res * b + uget(c);
}
return res;
}
a进制转b进制
Acwing 1346. 回文平方 原题链接
回文数是指数字从前往后读和从后往前读都相同的数字。
例如数字 1232112321 就是典型的回文数字。
现在给定你一个整数 BB,请你判断 1∼3001∼300 之间的所有整数中,有哪些整数的平方转化为 BB 进制后,其 BB 进制表示是回文数字。
输入格式
一个整数 BB。
输出格式
每行包含两个在 BB 进制下表示的数字。
第一个表示满足平方值转化为 BB 进制后是回文数字那个数,第二个数表示第一个数的平方。
所有满足条件的数字按从小到大顺序依次输出。
数据范围
2≤B≤202≤B≤20, 对于大于 99 的数字,用 AA 表示 1010,用 BB 表示 1111,以此类推。
输入样例:
10
输出样例:
1 1
2 4
3 9
11 121
22 484
26 676
101 10201
111 12321
121 14641
202 40804
212 44944
264 69696
private static char get(int x) {
if (x <= 9) return (char) (x + '0');
return (char) (x - 10 + 'A');
}
public static String base(int n, int b) {
String num = "";
while (n > 0) {
num += get(n % b);
n /= b;
}
num = new StringBuilder(num).reverse().toString();
return num;
}
private static boolean check(String num) {
int l = 0;
int r = num.length() - 1;
while (l < r) {
if (num.charAt(l) != num.charAt(r)) return false;
l++;
r--;
}
return true;
}
public static void main(String[] args) {
int n = in.nextInt();
for (int i = 1; i <= 300; i++) {
String s = base(i * i, n);
if (check(s)) {
out.println(base(i, n) + " " + s);
}
}
out.flush();
out.close();
}
Acwing 124. 数的进制转换 原题链接
编写一个程序,可以实现将一个数字由一个进制转换为另一个进制。
这里有62个不同数位{0-9,A-Z,a-z}。
输入格式
第一行输入一个整数,代表接下来的行数。
接下来每一行都包含三个数字,首先是输入进制(十进制表示),然后是输出进制(十进制表示),最后是用输入进制表示的输入数字,数字之间用空格隔开。
输入进制和输出进制都在2到62的范围之内。
(在十进制下)A = 10,B = 11,…,Z = 35,a = 36,b = 37,…,z = 61 (0-9仍然表示0-9)。
输出格式
对于每一组进制转换,程序的输出都由三行构成。
第一行包含两个数字,首先是输入进制(十进制表示),然后是用输入进制表示的输入数字。
第二行包含两个数字,首先是输出进制(十进制表示),然后是用输出进制表示的输入数字。
第三行为空白行。
同一行内数字用空格隔开。
输入样例:
8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030
输出样例:
62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001
10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A
35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05
23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj
49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S
61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030
5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890
朴素写法:
private static void function1() {
int n = in.nextInt();
while (n-- > 0) {
int a = in.nextInt();
int b = in.nextInt();
String str = in.next();
String base10 = base10(str, a);
String baseB = base(base10, b);
out.println(a + " " + str);
out.println(b + " " + baseB);
out.println();
}
out.flush();
out.close();
}
private static int uget(char c) {
if (c <= '9') return c - '0';
if (c <= 'Z') return c - 'A' + 10;
return c - 'a' + 36;
}
private static String base10(String num, int b) {
BigInteger res = new BigInteger("0");
for (char c : num.toCharArray()) {
res = res.multiply(BigInteger.valueOf(b)).add(BigInteger.valueOf(uget(c)));
}
return res.toString();
}
private static char get(int x) {
if (x <= 9) return (char) (x + '0');
if (x <= 35) return (char) (x - 10 + 'A');
return (char) (x - 36 + 'a');
}
public static String base(String n, int b) {
StringBuilder num = new StringBuilder();
BigInteger bn = new BigInteger(n);
BigInteger bb = BigInteger.valueOf(b);
while (bn.compareTo(BigInteger.valueOf(0)) > 0) {
num.append(get(bn.mod(bb).intValue()));
bn = bn.divide(bb);
}
num.reverse();
if (num.length() == 0) num.append(0);
return num.toString();
}
短除法:
private static void function2() {
int n = in.nextInt();
List<Integer> number = new ArrayList<>();
while (n-- > 0) {
int a = in.nextInt();
int b = in.nextInt();
String baseA = in.next();
for (char c : baseA.toCharArray()) {
if (c >= '0' && c <= '9') number.add(c - '0');
if (c >= 'A' && c <= 'Z') number.add(c - 'A' + 10);
if (c >= 'a' && c <= 'z') number.add(c - 'a' + 36);
}
List<Integer> res = new ArrayList<>();
while (number.size() > 0) {
int r = 0;
for (int i = 0; i < number.size(); i++) {
number.set(i, number.get(i) + r * a);
r = number.get(i) % b;
number.set(i, number.get(i) / b);
}
res.add(r);
while (number.size() > 0 && number.get(0) == 0) number.remove(0);
}
Collections.reverse(res);
StringBuilder sb = new StringBuilder();
for (int x : res) {
if (x <= 9) sb.append(x);
if (x >= 10 && x <= 35) sb.append((char) (x - 10 + 'A'));
if (x >= 36) sb.append((char) (x - 36 + 'a'));
}
out.println(a + " " + baseA);
out.println(b + " " + sb.toString());
out.println();
}
out.flush();
out.close();
}