十进制到八进制转换

时间:2012-10-30 20:29:03

标签: java decimal octal

  

可能重复:
  Decimal Conversion error

我正在为一个类编写程序,并且无法确定如何将八进制数转换为十进制数。这是我到目前为止所做的事情:

   import java.util.Scanner;

public class test   
{ 
public static void main ( String args[])
{
    Scanner input = new Scanner(System.in);

    System.out.print("Enter number: ");
    int oct  = input.nextInt();
    int d2count = 0;
    int result=0;
    int d3count = 0;
    int d3 = 0;
    int d2 = 0;

    d3 = oct;
    d2 = oct;

    if(oct < 1000){
    while ( d3 >= 100){
    d3 = d3 - 100;
        d3count++;
    }}

    if (oct < 100){
    while ( d2 >= 10){
    d2 = d2 - 10;
        d2count++;
    }}

    result = (d3count * 64)+(d2count * 8) + d2;
System.out.printf("%d\n",result);
}
}

所以基本上我需要一种方法将数字减少到单个数字(即1337到1,3,3,7)。 我真的很想用我现在拥有的东西来做,但我的做法似乎有一些我看不到的错误。如果我输入一个小于100的数字,它实际上有效,但是当我输入一个高于100的数字时,转换就会在某个地方搞砸了。我是java的新手,所以技术越基本越好,谢谢

5 个答案:

答案 0 :(得分:3)

以下从十进制转换为八进制,

import java.util.Scanner;

public class test { 
    public static void main ( String args[]) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter number: ");
        int oct  = input.nextInt();
        String result= Integer.toString(oct,8);
        System.out.println(result);
    }
}

以下从八进制转换为十进制,

public static void main ( String args[]) {
     Scanner input = new Scanner(System.in);
     System.out.print("Enter number: ");
     String oct  = input.next();
     int result= Integer.parseInt(oct,8);
     System.out.println(result);
 }

以下是从八进制转换为十进制的更多算法方法

     public static int convert(String oct) {
         int i= 0;  
         for(int j = 0; j < oct.length(); j++) { 
                char num = oct.charAt(j);           
                num -= '0';     
                if(num<0||num>7) {          
                    sysout("invalid number");
                    return -1;
                }
                i *= 8;                          
                i += num;                      
            }
            return i;
        }
     }

以下是将小数转换为八进制,

public static int convert(int OctalNumber){
   int counter=0;
   int result = 0;
   while(OctalNumber !=0) {
        int temp = (int) ((OctalNumber%8) * Math.pow(10, counter));
        counter++;
        result += temp;
        OctalNumber /= 8;
    }
    return result;
}

答案 1 :(得分:0)

首先,您的代码将八进制转换为十进制。

其次,你有

if(oct < 1000){

if (oct < 100){

但您没有if语句来处理输入数字大于1000的情况。

编辑:我刚才意识到这不是问题所在。当你开始计算d2时,你需要在减去100次之后使用d3的 end 值。所以如果你需要一个

,就在第二个之前
d2 = d3;

但仍然需要处理大于1000的输入。

答案 2 :(得分:0)

使用移位功能。而不是使用&lt; 1000等

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html

答案 3 :(得分:0)

你可以使用一些更好的算法,允许任何合理长度的十进制数(即不会导致溢出):

public int octalToDecimal(int octal)
{         
   int numDigits = Integer.toString(octal).length();
   int decimalResult = 0;
   int mask = 0x00000007;
   for(int i = 0; i < numDigits; i++)
   {
      int octalDigit = octal & mask;
      octal = octal >> 3;    
      decimalResult += octalDigit * Math.pow(8, i);
   }

   return decimalResult;
}

答案 4 :(得分:0)

这个辅助方法可能有所帮助:

int strangeDecimalAsBaseN(int number, int base) {
  if (base < 2 || base > 10) throw new InvalidArgumentException("Impossible or unsupported base " + base);
  if (number < 0) throw new InvalidArgumentException("Negative number (" + number + ") not supported");
  int result = 0;
  int shift = 1;  
  while(number > 0) {
    int lastResult = result;
    result += shift * (number % base);
    if (lastResult > result) throw new IllegalStateException("Overflow!");
    shift *= 10;
    number /= base;
  }
  return result;
}

或者也许是这样,如果你真的想要另一种方式:

int strangeFixBaseN(int funnyNumber, int base) {
  if (base < 2 || base > 10) throw new InvalidArgumentException("Impossible base " + base);
  if (funnyNumber < 0) throw new InvalidArgumentException("Negative number (" + funnyNumber + ") not supported");
  int result = 0;
  int shift = 1;  
  while(funnyNumber > 0) {
    int lastResult = result;
    result += shift * (funnyNumber % 10);
    if (lastResult > result) throw new IllegalStateException("Overflow!");
    shift *= base;
    funnyNumber /= 10;
  }
  return result;
}

小心,未经测试的代码:)