1

Java を使ったコーディングの仕方を独学で学んでおり、インターネットで見つけた演習を使用して、学んだことを実践しています。

とにかく、私はユーザーから文字「0」と「1」のみを含む2つの文字列を取得し、それらの両方(バイナリ)を組み合わせた1つの文字列を返すメソッドを構築するように求める演習の最中です

例:

BinaryAdder("0","0") - > "0"
BinaryAdder("1","1") - > "10"
BinaryAdder("10100","111") - > "11011"

私がしたことは:

import java.util.Scanner;


public class assigment03
{
    private static String whichIsBigger(String a, String b)
    {
        if(a.length()>b.length())
            return a;
        if(a.length()<b.length())
                return b;
        if(a.length()==b.length())
            return a;
        else return null;
    }



private static String binaryAdder(String a,String b)
{

    int[] binaryResult= new int[maxlength(a,b)+1];
    String result="";

    if(whichIsBigger(a,b)==a)
    {
        for(int i=0;i<b.length();i++)
        {
            binaryResult[i]=a.charAt(i)+b.charAt(i);
        }
        for(int i=b.length();i<a.length();i++)
        {
            binaryResult[i]+=a.charAt(i);
        }
    }
    else
    {
        for(int i=0;i<a.length();i++)
        {
            binaryResult[i]=b.charAt(i)+a.charAt(i);
        }
        for(int i=a.length();i<b.length();i++)
        {
            binaryResult[i]+=b.charAt(i);
        }
    }
    for(int i=0;i<binaryResult.length-1;i++)
    {
        if(binaryResult[i]>=2)
        {
            binaryResult[i]=binaryResult[i]%2;
            binaryResult[i+1]++;
        }
    }
        for(int i=binaryResult.length-1;i>=0;i--)
        {
            result+=Integer.toString(binaryResult[i]);
        }
    return result;

}

private static int maxlength(String a, String b)
{
    if(a.length()>b.length())
        return a.length();
    else
        return b.length();
}
public static void main(String[] args)
{
    Scanner temp= new Scanner(System.in);
    System.out.print(binaryAdder(temp.next(),temp.next()));
}
}   

しかし、それは正しい結果を返しません。ここで私を助けてくれませんか?

どうもありがとう!

4

1 に答える 1

0

あなたの質問を読んで、実際に 2 つの 2 進数を加算し、結果を基数 2 で返す方法を実装するためのヘルプを探している可能性があることを理解しました (ところで、Java では複雑になる可能性があります)。ただし、この演習には、2 進数の読み取りに許可される最大長のような非常に重要な制限が欠けていると思います (int や String などのプリミティブ データ型で値を処理しているときにオーバーフローが発生する可能性があります)。また、この演習では、"00110b" = "0110b" = "0110b" であるため、これらのケースのように有意なゼロを処理する場合や、2 ("10b") または 3 ( "11b")。これらのトピックの詳細については、ここの第 2 章を参照してください。

少なくとも Java では、この種の演習に取り組む場合、そのような制限や条件に対処することを避けるという選択肢があります。Java はBigIntegerと呼ばれるクラスを提供します。このクラスは、巨大な値を処理し、重要なゼロを処理せず、プログラマーからそれらを処理する負担を取り除きます。Java BigInteger は、任意のベースでオブジェクトを初期化できるコンストラクターも提供します。(まあ、これにもいくつかの制限があります。詳細については、このリンクを参照してください)。

そうは言っても、この演習に対する私の解決策は次のとおりです。

import java.util.Scanner;
import java.util.ArrayList;
import java.math.BigInteger;

public class BinaryAdder {
    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        ArrayList<String> numbers = new ArrayList<String>();
        String number = "";
        int count = 1;

        System.out.print("Instructions:\nPlease enter a set of binary numbers. When you are ready to calculate their addition, enter \"done\",\n\n");
        System.out.print("Number " + count + ": ");

        while(!(number = scanner.next()).equals("done")){
            numbers.add(number);
            count++;
            System.out.print("Number " + count + ": ");
        }

        System.out.print("Result = " + binaryAdder(numbers) + "b");

        scanner.close();
    }

    public static String binaryAdder(ArrayList<String> numbers){
        BigInteger accumulator = new BigInteger("0");

        for(String number: numbers){
            accumulator = accumulator.add(new BigInteger(number, 2));
        }

        return accumulator.toString(2);
    }
}

例:

指示: 2 進数のセットを入力してください。追加を計算する準備ができたら、「完了」と入力します。

数値 1: 00001
数値 2: 011
数値 3: 完了
結果 = 100b

8 行目から 11 行目の間で、いくつかの変数が宣言されています。入力された 2 進数を読み取るスキャナー、入力された 2進数を格納する配列リスト、数値を一度保持する文字列、入力された数値の数を追跡するintです。このソリューションを拡張して 0,1,2,3,...,n の数字を追加したため、入力されました)。

行 13 は、このソリューションの指示を出力します。14 行目は「Number 1:」のみを出力します。

行 16 ~ 20 の間の while ループは、入力された値を変数numberに設定し、それが "done" に等しいかどうかをチェックします。場合によってはループから抜け出し、それ以外の場合は配列 listに番号を追加します。

22 行目は、入力されたすべての 2 進数の加算結果を出力します。

しかし、「マジック」は、メソッド「binaryAdder」の 27 ~ 35 行目で実際に発生します (「binaryAdder」は、パラメーターとして入力されたすべての数値を保持する ArrayList を受け取ることに注意してください)。28 行目では、ArrayList 内のすべての数値の加算を保持するために、BigInteger 型のアキュムレータがゼロに初期化されます。次に、for ループが配列リスト内のすべての数値を調べて、それらをアキュムレータに追加します。最後に、累積値が基数 2 で返されます。

于 2014-11-21T04:43:13.507 に答える