在java中转换为基数10?

时间:2017-02-20 20:11:55

标签: java recursion

我有一个家庭作业,我必须将任何基础转换为基础10.我有一些给定的数字,它们是" basen"。我必须将这些基数转换为基数10.我陷入的唯一部分是代码的这一部分:

answer = ; // Not sure what I have to put in here

我已经看过其他一些关于转换到十号的帖子,但我不知道如何将它们合并到我的代码中。

public class BaseN {

public static final int BASEN_ERRNO = -1;
public static int digit  = 0;

public static void main(String[] argv) {
  basen(512, 6);
  basen(314, 8);
  basen(49, 5);
  basen(10101, 2);
}

public static void basen(int n, int b) {
  int ans = basen(n, b, 1, 0);
  if (ans == BASEN_ERRNO)
     System.out.println(n + " is not a valid base-" + b + " number");
  else
     System.out.println(n + " base-" + b + " = " + ans + " base-10");
}

public static int basen(int number, int base, int placevalue, int answer) {
  if (number == 0) return answer;
  digit = number % 10;
  if (digit >= base) return BASEN_ERRNO;
  answer = 1;// not sure what to put here
  number = 0;
  placevalue = 0;
  return basen(number, base, placevalue, answer);
}
}

2 个答案:

答案 0 :(得分:0)

您可以实施以下算法。假设您有String number表示要转换为十进制形式的数字,int base表示给定数字的基数。你可以实现函数 int convertToNumber(char c); ,它接受​​一个代表你的号码中一位数的字符,并将字符映射到这样的数字:

0 - > 0, 1 - > 1, ......, A-> 10, B - > 11, ......, F - > 15, ...

然后,您只需遍历给定的字符串,并将此函数输出与基数乘以迭代的幂。例如,转换编号A32(十六进制): A32 = convertToNumber(A)* b ^ 2 + convertToNumber(3)* b ^ 1 + convertToNumber(2)* b ^ 0 = 10 * 16 ^ 2 + 3 * 16 ^ 1 + 2 * 16 ^ 0 = 10 * 16 * 16 + 3 * 16 + 2 = 2610(十进制)。

public class BaseConvert {

    public static int convertDigitToNumber(char c) throws Exception {
        if(c >= '0' && c <= '9') return c - '0';
        if(c >= 'A' && c <= 'Z') return c - 55;
        if(c >= 'a' && c <= 'z') return c - 97;
        throw new Exception("Invalid digit!");
    }

    public static int convertToBase(String number, int base) throws Exception {
        int result = 0;
        for(int i = 0; i < number.length(); i++){
            result += convertDigitToNumber(number.charAt(i)) * (int)Math.pow(base, number.length() - i - 1);
        }
        return result;
    }

    public static void main(String[] args) {

        try{
            System.out.println(convertToBase("732", 8));
            System.out.println(convertToBase("A32", 16));
            System.out.println(convertToBase("1010", 2));
        }catch (Exception e) {
            System.out.print(e);
        }
    }
}

答案 1 :(得分:0)

您可以像这样查看k长度的基数n:
x(0)* n ^(k-1)+ x(1)* n ^(k-2)+ ... + x(k-1)* n ^ 1 + x(k)* n ^ 0 <登记/> 其中x(0),x(1),...,x(k)是从左边开始的位置k处的数字。

所以,如果你试图将101 base 2转换为10,你会做以下事情:
1 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 0 = 4 + 0 + 1 = 5 base 10

说你想从基数6转换数字352:
3 * 6 ^ 2 + 5 * 6 ^ 1 + 2 * 6 ^ 0 = 108 + 30 + 2 = 145 base 10

您正在寻找的代码是这样的:

int[] digits = {3, 5, 2};
int base = 6;
int answer = 0;
for(int i = digits.length - 1; i >= 0; i--)
{
    answer += digits[i] * Math.pow(base,digits.length-i-1); 
}
return answer;

将返回145.

希望即使我的实现是迭代的,你也应该能够将它应用到你的递归实现中。