2013-09-21 5 views
1

Я преподаю, как кодировать java, и я использую упражнения, которые я нахожу в Интернете, чтобы практиковать то, что я изучаю.Добавьте две строки, содержащие двоичные числа

Во всяком случае, я нахожусь в середине упражнения, которое просит меня создать метод, который получает две строки, содержащие только символы «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

Разве вы не можете просто анализировать как целое, добавить и скрывать обратно в двоичный файл? – arshajii

+2

Вы не можете использовать 'a.charAt (i) + b.charAt (i)' - это дает значение ASCI для 'char'. –

+1

несколько советов при сравнении значений String никогда не используйте оператор ==, вместо этого используйте метод equals(), так как оператор == сравнивает 2 объекта в памяти, а метод equals() сравнивается, если оба объекта значимо равны или нет (даже если оба являются двумя разными объектами в памяти), во-вторых, при использовании if-else всегда используйте фигурные скобки, чтобы сделать ваш код более удобным для чтения, а также проще в обслуживании. –

ответ

0

Прочитав ваш вопрос, я понял, что вы можете найти какую-то помощь в реализации методов, чтобы фактически добавить два двоичных числа, а затем дать результат в базе два (что может быть сложным в Java). Однако я считаю, что в этом упражнении отсутствует очень важное ограничение, такое как максимальная длина, разрешенная для чтения двоичных чисел (переполнение может возникать при обработке значений примитивными типами данных, такими как int или String). Кроме того, это упражнение требует некоторого планирования при работе с ни одним значительным нулем, как в этих случаях, поскольку «00110b» = «0110b» = «0110b» и при работе с переносом переноса любого добавления, которое дает 2 («10b») или 3 ("11b"). Более подробную информацию по этим темам можно найти here, в главе 2.

По крайней мере, в Java, при решении этих типов упражнений, вариант, чтобы избежать работы с такими ограничениями и условиями. Java предоставляет класс BigInteger, который заботится о огромных значениях, не имеет значительных нулей, а носители убирают бремя, связанное с этими вещами от программистов. Java BigInteger также предлагает конструктор, который может инициализировать свои объекты в любой базе. (Ну, нет, есть некоторые ограничения на это, см. Это link для получения дополнительной информации).

С учетом сказанного, вот мое решение этого упражнения:

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:».

Цикл while между строками 16-20 устанавливает значение, введенное в переменную , номер и проверяет, равен ли он «сделанному». В этом случае он выходит из цикла, в противном случае он добавляет номер в список массивов .

Строка 22 печатает результат добавления всех введенных двоичных чисел.

Но «магия» действительно происходит между строками 27-35 в методе «binaryAdder» (обратите внимание, что «binaryAdder» получает, что ArrayList содержит все числа, введенные в качестве параметра). На строке 28 аккумулятор типа BigInteger инициализируется равным нулю, чтобы сохранить добавление всех чисел в ArrayList. Затем цикл for перемещается по всем числам в списке массивов, чтобы добавить их в накопитель. Наконец, накопленное значение возвращается в базе два.

Смежные вопросы