简体   繁体   English

iProblems中包含substr,整数和将十进制转换为二进制以及将二进制转换为十进制的循环

[英]iProblems with substr, integers and loops in converting decimal to binary and binary to decimal

I wrote this program for someone who wanted it without using of ToBinaryString and ToString methods. 我为不需要使用ToBinaryString和ToString方法的人编写了该程序。 I wrote the app, but it doesn't work! 我编写了该应用程序,但是它不起作用! If I do Dec2Bin, it gives me null! 如果我执行Dec2Bin,它将给我空值! and if I do Bin2Dec it gives me String out of index: -1! 如果我执行Bin2Dec,它将使我的字符串超出索引:-1! Can someone help me fix it? 有人可以帮我解决吗?

Code: 码:

package decimalBinary;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class DecBin {
    public static void main(String[] args) throws NumberFormatException, IOException {
        int conargs1,conargs2;
        // conargs1 is input
        // conargs2 is mode, if = 1 then dec2bin, if = 2 then bin2dec
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter number: ");
        conargs1=Integer.parseInt(br.readLine());
        System.out.println("Enter mode: ");
        conargs2 = Integer.parseInt(br.readLine());
        System.out.println(conargs2==1 ? "Dec2Bin" : (conargs2==2 ? "Bin2Dec" : "none"));
        if (args.length == 2){ // TO BINARY
            if(conargs2==1){
                System.out.println(DecBin.dec2bin(String.valueOf(conargs1)));
            }else if (conargs2==2){ // TO DECIMAL
                System.out.println(DecBin.bin2dec(String.valueOf(conargs1)));
            }
            System.exit(0);
        }
    }

    public static String dec2bin(String arg){
        String out = null;
        String tmp;
        long i, x;
        int maxpower = 30;
        x = Long.parseLong(arg);

        if (x == 0){
            return "0";
        }else if (x > 0){ // positive decimals
            if (x > Math.pow(2, maxpower)) {
                return "should be no larger than " + String.valueOf(2 ^ maxpower);
            }
            out = "";
            for(i = maxpower+1; i <= 0; i--){
                if (x % (Math.pow(2, i))==0){
                    out = out + "1";
                }else{
                    out = out + "0";
                }
            }
        }else{ // negative decimals
            x = -x;
            x = Math.abs(x);
            if (x > Math.pow(2, maxpower)) {
                return "should be no larger than " + String.valueOf(2 ^ maxpower);
            }
            out = "";
            for(i = maxpower+1; i <= 0; i--){ // Inverted Binary
                if (x % (Math.pow(2, i))==0){
                    out = out + "0";
                }else{
                    out = out + "1";
                }
            }

            x = DecBin.bin2dec(out)+1;

            out= "";
            for(i = maxpower+1; i <= 0; i--){
                if (x % (Math.pow(2, i))==0){
                    out = out + "1";
                }else{
                    out = out + "0";
                }

            }

        }
        return out;
    }

    public static long bin2dec(String arg){
        // If it was a positive number.
        long dec = 0; // initializing decimal number
        long length = arg.length(); // length of our binary string
        char temp;
        //long charplace;
        long lengthofchar = 1;
        long x = 0;
        if (arg.length() <= 0){return 0;}
        for (x = 0; x <= length; x++) {
            // charplace = 0;
            // charplace = -x;
            // charplace += -1;
            // charplace += arg.length();

            // charplace = Long.sum(charplace, 5);
            // charplace -= lengthofchar;
            // charplace--;
            temp = arg.charAt(arg.length()-x-1);
            // length = length - 1;
            if (temp != '0') {
                dec += Math.pow(2 , x - 1);
            }
        }

        return dec;
    }

}

This is the error I'm getting when using bin2dec: 这是我在使用bin2dec时遇到的错误:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method charAt(int) in the type String is not applicable for the arguments (long)

    at decimalBinary.DecBin.bin2dec(DecBin.java:98)
    at decimalBinary.DecBin.main(DecBin.java:22)

Before this, I have used int type for variables, but I got String out of Index: -1 in the line I've used charAt. 在此之前,我已经将int类型用于变量,但是在使用charAt的那一行中,我String out of Index: -1中得到了String out of Index: -1 I've also used substr before that and I got the same error! 在此之前,我还使用过substr,并且遇到了同样的错误!

EDIT: If I use temp = arg.charAt(Integer.parseInt(String.valueOf(arg.length()-x-1))); 编辑:如果我使用temp = arg.charAt(Integer.parseInt(String.valueOf(arg.length()-x-1))); I will get this error: 我会收到此错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.charAt(Unknown Source)
    at decimalBinary.DecBin.bin2dec(DecBin.java:98)
    at decimalBinary.DecBin.main(DecBin.java:22)

There is a problem with your for loop inequality statements, namely: 您的for loop不平等语句存在问题,即:

In your dec2bin method: for(i = maxpower+1; i <= 0; i--) should be for(i = maxpower+1; i >= 0; i--) because you will never enter the loop and you print the default value for out which is null . 在您的dec2bin方法中: for(i = maxpower+1; i <= 0; i--)应该是for(i = maxpower+1; i >= 0; i--)因为您将永远不会进入循环并且您打印默认值out这是null

In your bin2dec method: for (x = 0; x <= length; x++) should be for (x = 0; x < length; x++) because temp = arg.charAt(arg.length()-x-1); 在您的bin2dec方法中: for (x = 0; x <= length; x++)应该是for (x = 0; x < length; x++)因为temp = arg.charAt(arg.length()-x-1); can be -1 at the end of your loop. 在循环结束时可以为-1

*After your updated question with the error stacktrace, use int instead of long for your variables or else you need casting to int for charAt to work. *在更新了有关错误stacktrace的问题之后,请对变量使用int而不是long ,否则您需要将其强制转换为int以便charAt起作用。

Finally, I've managed to edit my code :) 最后,我设法编辑了代码:)

Thanks to Konstantinos Chalkias I found out what I had to do :D 感谢Konstantinos Chalkias,我找到了必须要做的:D

This is the final class (that works very good!): 这是最后一堂课(效果非常好!):

package decimalBinary;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class DecBin {
    public static void main(String[] args) throws NumberFormatException, IOException {
        int conargs1,conargs2;
        // conargs1 is input
        // conargs2 is mode, if = 1 then dec2bin, if = 2 then bin2dec
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Enter number: ");
        conargs1=Integer.parseInt(br.readLine());
        System.out.println("Enter mode: ");
        conargs2 = Integer.parseInt(br.readLine());
        System.out.println(conargs2==1 ? "Dec2Bin" : (conargs2==2 ? "Bin2Dec" : "none"));
        if (args.length == 2){ // TO BINARY
            if(conargs2==1){
                System.out.println(DecBin.dec2bin(String.valueOf(conargs1)));
            }else if (conargs2==2){ // TO DECIMAL
                System.out.println(DecBin.bin2dec(String.valueOf(conargs1)));
            }
            System.exit(0);
        }
    }

    public static String dec2bin(String arg){
        String out = null;
        String tmp;
        long i, x;
        int maxpower = 30;
        x = Integer.parseInt(arg);

        if (x == 0){
            return "0";
        }else if (x > 0){ // positive decimals
            if (x > Math.pow(2, maxpower)) {
                return "should be no larger than " + String.valueOf(2 ^ maxpower);
            }
            out = "";

            int binary[] = new int[30];
            int index = 0;
            while(x > 0){
                binary[index++] = (int) (x % 2);
                x = x/2;
            }

            for(i = index-1;i >= 0;i--){
                out = out+binary[(int) i];
            }
        }else{ // negative decimals
            // x = -x;
            x = Math.abs(x); // convert positive of decimal to binary 
            if (x > Math.pow(2, maxpower)) {
                return "should be no larger than " + String.valueOf(2 ^ maxpower);
            }
            long xBinaryPositive;
            xBinaryPositive = Long.parseLong(DecBin.dec2bin(String.valueOf(x)));
            String xBinaryInverted;
            out = "";


            xBinaryInverted = String.valueOf(xBinaryPositive).replace('0', '2').replace('1', '0').replace('2', '1');
            long xBinaryInvertedIntVal;
            xBinaryInvertedIntVal = DecBin.bin2dec(xBinaryInverted);
            out = DecBin.dec2bin(String.valueOf(xBinaryInvertedIntVal+1));
        }
        return out;
    }

    public static long bin2dec(String binaryInput){
        long binary = Long.parseLong(binaryInput);
        long decimal = 0;
        long power = 0;
        while(true){
            if(binary == 0){
                break; 
            } else {
                long tmp = binary % 10;
                decimal += tmp * Math.pow(2, power);
                binary = binary/10;
                power++;
            }
        } 
        return decimal; 
    }
}

In final code, I used while instead of for . 在最终代码中,我使用while代替for
I found much of this code in Java2Novice's Interview Programs . 我在Java2Novice的Interview Programs中找到了很多这样的代码。 Many thanks to them for those codes. 非常感谢他们提供这些代码。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM