簡體   English   中英

添加兩個包含二進制數字的字符串

[英]Add two strings containing binary numbers

我正在教自己如何使用Java進行編碼,並且使用在Internet上找到的練習來練習所學內容。

無論如何,我處於一個練習的中間,要求我構建一個方法,該方法從用戶那里獲得兩個僅包含字符“ 0”和“ 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()));
}
}   

但這不會返回正確的結果。 你介意在這里幫我嗎?

非常感謝!

閱讀您的問題,我了解到您可能正在尋求一些幫助,以實現實際添加兩個二進制數的方法,然后以基數2返回結果(在Java中,btw可能很復雜)。 但是,我認為此練習沒有一個非常重要的限制,例如允許讀取二進制數字的最大長度(在處理諸如int或String之類的原始數據類型的值時可能會發生溢出)。 同樣,在處理像這樣的情況下不重要的零時,此練習也需要一些計划,因為“ 00110b” =“ 0110b” =“ 0110b”,並且在處理產生2(“ 1​​0b”)或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);
    }
}

例:

說明:請輸入一組二進制數。 准備好計算它們的加法時,輸入“完成”,

編號1:00001
2號:011
數字3:完成
結果= 100b

在第8-11行之間聲明了一些變量: 掃描程序讀取輸入的二進制數字,存儲輸入的二進制數字的數組列表 ,輸入一次保存數字的字符串以及用於跟蹤有多少個數字的int輸入,因為我擴展了此解決方案以添加0、1、2、3,...,n個數字)。

第13行打印此解決方案的說明。 第14行僅打印“數字1:”。

第16-20行之間的while循環將輸入的值設置為變量號,並檢查其是否等於“ done”。 在這種情況下,它會跳出循環,否則,會將數字添加到數組list中

第22行顯示所有輸入的二進制數字相加的結果。

但是“魔術”確實發生在方法“ binaryAdder”的第27-35行之間(請注意,“ binaryAdder”接收到包含所有作為參數輸入的數字的ArrayList)。 在第28行,將BigInteger類型的累加器初始化為零,以保存ArrayList中所有數字的加法。 然后,for循環遍歷數組列表中的所有數字,以將其添加到累加器中。 最后,累加值以二為底返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM