当我输入像10,1011,1101这样的二进制文件时,它可以正常工作。但是它总是打印"不是二进制"当我输入10011010010时,它应该是1234.如何修改它?
import java.util.Scanner;
public class Binary {
public static int toDecimal(String b) {
int decimal = Integer.parseInt(b,2);
return decimal;
}
public static boolean isBinary(String b) {
int inputNum = Integer.parseInt(b);
while(inputNum != 0){
if(inputNum % 10 > 1){
return false;
}
inputNum = inputNum / 10;
}
return true;
}
public static void main(String[] args) {
System.out.print("Enter binary: ");
Scanner in = new Scanner(System.in);
String binaryNum = in.next();
try{
int intNum = Integer.parseInt(binaryNum);
boolean isBinary = isBinary(binaryNum);
if(isBinary){
int outputDecimal = toDecimal(binaryNum);
System.out.println("\n"+ outputDecimal +" in decimal");
}else{
System.out.println("\n" + "Not binary!");
}
}catch(Exception e){
System.out.println("\n" + "Not binary!");
}
}
}
答案 0 :(得分:1)
为什么从字符串到int的转换次数如此之多?将输入保持为字符串形式,以检查输入是否为二进制。然后最后将字符串转换为数字类型。如果您认为您的输入不会超过最大int值,则可以使用parseInt()
,否则请使用long
或BigInteger
。
输入为字符串时,isBinary()
可能如下所示:
public static boolean isBinary(String b) {
for(int i=0; i<b.length(); i++) {
if(b.charAt(i) != '0' && b.charAt(i) != '1') {
return false;
}
}
return true;
}
然后将所有Integer.parseInt()
调用更改为long.parseLong()
,并相应地更改关联的变量,即从int更改为long。到目前为止,这应该足以满足您的期望。我的意思是对于任意大的输入,你必须使用BigInteger(见下文)。
如果您选择使用java.math.BigInteger
,您可以使用带有基数的构造函数,如下所示:
public static BigInteger toDecimal(String b) {
return new BigInteger(b, 2);
}
答案 1 :(得分:0)
问题是您正在尝试解析超过
的数字
Integer.MAX_VALUE
which is 2^31 - 1:
int intNum = Integer.parseInt(binaryNum);
请尝试使用Long.parseLong
。 long
有64位且范围为-9,223,372,036,854,775,808
到9,223,372,036,854,775,807
,这应该足以覆盖您的各种输入(尽管显然对于更长的数字会失败)。
答案 2 :(得分:0)
虽然一次处理多于1位的效率会更高,但仍然有效。结果为10000000000000000000000000000000000000000000000000000000000000是9,223,372,036,854,775,808
import java.util.regex.Pattern;
import java.math.BigDecimal;
...
public static BigDecimal toDecimal(String b) {
BigDecimal bd1 = new BigDecimal(b.charAt(0)=='1'?1:0);
BigDecimal two = new BigDecimal(2);
for (int i = 1; i<b.length(); i++) {
bd1 = bd1.multiply(two);
bd1 = bd1.add(new BigDecimal(b.charAt(i)=='1'?1:0));
}
return bd1;
}
public static boolean isBinary(String b) {
return Pattern.compile("[01]+").matcher(b).matches();
}
public static void main(String[] args) {
System.out.print("Enter binary: ");
Scanner in = new Scanner(System.in);
String binaryNum = in.next();
try{
boolean isBinary = isBinary(binaryNum);
if(isBinary){
BigDecimal outputDecimal = toDecimal(binaryNum);
System.out.println("\n"+ outputDecimal +" in decimal");
}else{
System.out.println("\n" + "Not binary!");
}
}catch(Exception e){
System.out.println("\n" + "Not binary!");
}
}
使用BigInteger的更多最小版本
public static void main(String[] args) {
System.out.print("Enter binary: ");
Scanner in = new Scanner(System.in);
String binaryNum = in.next();
try{
if(Pattern.compile("[01]+").matcher(binaryNum).matches()){
BigInteger outputDecimal = new BigInteger(binaryNum, 2);
System.out.println("\n"+ outputDecimal +" in decimal");
}else{
System.out.println("\n" + "Not binary!");
}
}catch(Exception e){
System.out.println("\n" + "Not binary!");
}
}