我正在教自己如何用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()));
}
}
但它没有返回正确的结果。 你介意帮帮我吗?
非常感谢!
答案 0 :(得分:0)
阅读你的问题,我明白你可能正在寻找一些帮助来实现实际添加两个二进制数的方法,然后将结果返回到二(btw在Java中可能很复杂)。但是,我认为这个练习缺乏一个非常重要的限制,例如允许读取二进制数的最大长度(在处理具有原始数据类型(如int或String)的值时会出现溢出)。此处练习还需要一些规划,因为在这些情况下不会处理任何重要的零,因为“00110b”=“0110b”=“0110b”,并且当处理滚动任何加法的进位时产生2(“10b”)或3( “11b” 时)。有关这些主题的更多信息,请参阅第2章 here 。
至少在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行之间声明了一些变量: scanner 以读取输入的二进制数, 数组列表 < / strong>存储输入的二进制数, 字符串 以输入一次数字,并输入 int 跟踪已输入的数量,因为我将此解决方案扩展为添加0,1,2,3,...,n个数字。)
第13行打印此解决方案的说明。第14行只打印“1号:”。
第16-20行之间的while循环设置输入到变量 number 的值,并检查它是否等于“done”。鉴于这种情况它会退出循环,否则,它会将数字添加到数组列表。
第22行打印添加的所有二进制数的结果。
但是“魔术”确实发生在方法“binaryAdder”中的第27-35行之间(注意“binaryAdder”接收到包含作为参数输入的所有数字的ArrayList)。在第28行,将BigInteger类型的累加器初始化为零,以保持ArrayList中所有数字的相加。然后,for循环遍历数组列表中的所有数字,以将它们添加到累加器。最后,累计值以二分为单位返回。