0

我的程序应该将十进制数字转换为二进制。对于大数,它给我一个负数而不是二进制数。为什么是这样?

例如,如果我提供2321我得到100100010001,这很好。但如果我提供 241242141我得到-2127232070093227171.

我不能使用字符串、数组、函数。还有另一个选项没有将其定义为字符串?输出?

import java.util.Scanner;

public class d {

  public static void main(String[] args) {   

    long num = 0;
    long temp = 0L;

    Scanner sc = new Scanner(System.in);
    num = sc.nextLong();

    long place = 1L;
    long output = 0;
    //System.out.print(""+ num%2+ (num%2)%2);
    while(num != 0) {
      temp = num % 2;
      num = num / 2;    

      output += (place*temp);
      place *=10;
    }

    System.out.print(""+output);    
  }
}
4

3 回答 3

3

你的问题在这里

  output += (place*temp);
  place *=10;

这会产生一个溢出的数字。

一个简单的替代方法是创建一个字符串,而不是生成一个无论如何您都将转换为字符串的数字。

StringBuilder output = new StringBuilder();
while(num != 0) {
  output.append(num & 1);
  num >>>= 1;    
}

System.out.print(output.reverse());   

甚至

StringBuilder output = new StringBuilder();
for(long num = sc.netLong(); num != 0; num >>>= 1) 
  output.append(num & 1);

System.out.print(output.reverse());   

如果您不想使用除输入或输出之外的任何功能。

long num = 241242141;
int shift = 63;
while (num >>> shift == 0 && shift > 0) shift--;
for (; shift >= 0; shift--)
    System.out.print((num >>> shift) & 1);

// for comparison only
System.out.println("\n"+Long.toBinaryString(num));

印刷

1110011000010001000000011101
1110011000010001000000011101
于 2012-11-06T11:08:25.620 回答
1

使用递归:

public class d {
   static void toBinaryString( long number )
   {
      if( number > 1 ) toBinaryString( number / 2L );
      System.out.print( number % 2L );
   }
   public static void main(String[] args) {
      long num = 241242141L;
      System.out.println( Long.toBinaryString( num ));
      toBinaryString( num );
   }
}

输出:

1110011000010001000000011101
1110011000010001000000011101
于 2012-11-06T11:20:42.267 回答
1

问题是,您将您的存储Binary Equivalent在 along type中,它不能存储这么长的值。

您应该使用 aStringBuilder并将您的附加remainder - temp在其中。然后反向打印:-

    StringBuilder builder = new StringBuilder();
    while(num != 0) {
      temp = num % 2;
      num = num / 2;    

      builder.append(temp);
      output += (place*temp);
      place *=10;
    }

    System.out.println(builder.reverse());

如果您不需要使用 any methods,则只需使用String Concatenation, 然后循环以反向打印字符串:-

    String builder = "";
    while(num != 0) {
      temp = num % 2;
      num = num / 2;    

      builder += temp;
      output += (place*temp);
      place *=10;
    }

    for (int i = builder.length() - 1; i >= 0; i--) {
        System.out.print(builder.charAt(i));
    }

但是,请注意,这会产生大量的String objectson Heap。此外,您在这里使用了charAt一种您必须使用的方法。

于 2012-11-06T11:10:10.957 回答