1

我正在自学如何使用 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()));
}
}   

但它不会返回正确的结果。你介意帮我一下吗?

多谢!

4

1 回答 1

0

阅读您的问题,我了解到您可能正在寻求一些帮助来实现实际添加两个二进制数的方法,然后以二为基数返回结果(顺便说一句,这在 Java 中可能很复杂)。然而,我相信这个练习缺乏一个非常重要的限制,比如允许读取二进制数的最大长度是多少(在处理具有原始数据类型(如 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);
    }
}

例子:

说明:请输入一组二进制数。当你准备好计算它们的加法时,输入“完成”,

编号 1:00001
编号 2:011
编号 3:完成
结果 = 100b

在第 8-11 行之间声明了一些变量:一个用于读取输入的二进制数的扫描器、一个用于存储输入的二进制数的数组列表、一个用于保存输入一次数字的字符串以及一个用于跟踪有多少数字的int已输入,因为我将此解决方案扩展为添加 0、1、2、3、...、n 个数字)。

第 13 行打印此解决方案的说明。第 14 行只打印“Number 1:”。

第 16-20 行之间的 while 循环将输入的值设置为变量number并检查它是否等于“done”。考虑到它退出循环的情况,否则,它将数字添加到数组列表中

第 22 行打印所有输入的二进制数相加的结果。

但是“魔术”确实发生在方法“binaryAdder”的第 27-35 行之间(请注意,“binaryAdder”接收包含作为参数输入的所有数字的 ArrayList)。在第 28 行,一个 BigInteger 类型的累加器被初始化为零以保存 ArrayList 中所有数字的加法。然后,一个 for 循环遍历数组列表中的所有数字以将它们添加到累加器中。最后,以二为底返回累加值。

于 2014-11-21T04:43:13.507 回答