ECNU 1147 进制转换

ECNU 1147 进制转换

链接

https://acm.ecnu.edu.cn/problem/1147/

题目

单点时限: 2.0 sec

内存限制: 256 MB

输入一个十进制数n,将它转换成r进制数输出。

输入格式
输入一个正整数t。表示测试数据的组数。

每个测试实例包含两个整数n(32位整数) 和r (2 <= r <= 36).

输出格式
为每个测试实例输出转换后的数,每个输出占一行。如果r大于10,则对应的数字规则参考16进制(比如10用 A 表示 ,16用 G 表示等等)。

样例
input
3
7 2
23 12
-4 3
output
111
1B
-11

思路

传统艺能,数据不作妖就是考察细心的进制转换,这里要注意的是,可能存在负数,用flag存储符号位,其实不存也行,但是这样思路清晰一点。用除法来取数,从后往前,所以输出时要倒着输出,根据flag进行负号处理。
这题还有变形,m进制转n进制,这里最清晰的思路就是以十进制为中转,进行处理。狠一点可以用java自带的函数进行处理。
还要考虑到换行,就是格式问题。

代码

    public static void cal(int n, int r) {
    int flag = 0;
    //0+1-
    if (n < 0) {
      flag = 1;
      n = (-1) * n;
    }

    if (flag == 1) {
      System.out.print("-");
    }
    if (r == 10) {
      System.out.println(n);
    } else {
      int[] a = new int[36];
      int j = 0;
      while (n != 0) {
        a[j] = n % r;
        j++;
        n = n / r;
      }
      for (int num = j - 1; num >= 0; num--) {
        if (a[num] > 9) {
          char t = (char) (a[num] + 55);
          System.out.print(t);
        } else {
          System.out.print(a[num]);
        }
      }
      System.out.println();
    }
  }

  public static void fun() {
    Scanner sc = new Scanner(System.in);

    int t;
    t = sc.nextInt();
    for (int i = 0; i < t; i++) {
      int n;
      n = sc.nextInt();
      int r;
      r = sc.nextInt();
      cal(n, r);
    }
  }
posted @ 2021-01-11 15:46  cheng102e  阅读(124)  评论(0编辑  收藏  举报