0

私のプログラムは 10 進数を 2 進数に変換する必要があります。大きな数の場合、2進数ではなく負の数が返されます。どうしてこれなの?

たとえば、私が供給すると、それで問題あり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

問題は、そのような長い値を格納できないにを格納Binary Equivalentしていることです。long type

むしろ、を使用してそれStringBuilderに追加する必要があります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());

を使用する必要がない場合は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 に答える
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 に答える