傅芳杰

个人博客

You Deserve The Best


进制转换

10进制转b进制

ywbgjx.png

b进制转10进制

ywbyC9.png

    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进制

ywb63R.png

ywbcg1.png

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();
    }