Java 将二进制字符串拆分为5的幂

Java 将二进制字符串拆分为5的幂,java,string,Java,String,我试图分割一个二进制字符串,这样就可以将字符串分割成最小的正整数,每个正整数都是5的幂。如果没有这样的碎片,则返回-1 public class Power { public int numsOfWays(String s) { long[] f = new long[s.length() + 1]; f[0] = 0; for (int i = 1; i <= s.length(); ++i) { f[i]

我试图分割一个二进制字符串,这样就可以将字符串分割成最小的正整数,每个正整数都是5的幂。如果没有这样的碎片,则返回-1

public class Power {
    public int numsOfWays(String s) {
        long[] f = new long[s.length() + 1];
        f[0] = 0;
        for (int i = 1; i <= s.length(); ++i) {
            f[i] = Integer.MAX_VALUE;
            for (int j = 1; j <= i; ++j) {
                if (s.charAt(j - 1) == '0') {
                    continue;
                }
                int num = Integer.parseInt(s.substring(j - 1, i), 2);
                if (isPower(num)) {
                    f[i] = Math.min(f[i], f[j - 1] + 1);
                }
            }
        }
        return f[s.length()] == Integer.MAX_VALUE ? -1 : (int) f[s.length()];
    }

    private boolean isPower(long val) {
        if (val == 0) {
            return false;
        }
        int n = (int) (Math.log(val) / Math.log(5));
        return Math.pow(5, n) == val;
    }

    public static void main(String[] args) {

        Power b = new Power();
        System.out.println(b.numsOfWays("111011100110101100101110111"));
    }
}

问题出现在代码的第13行: 该行:

int num = Integer.parseInt(s.substring(j - 1, i), 2);
出现问题,因为该值太长,无法处理

将其更改为:

long num = Long.parseLong(s.substring(j - 1, i), 2);
它应该会起作用

编辑:整个代码如下所示:

public class Power {
    public int numsOfWays(String s) {
        long[] f = new long[s.length() + 1];
        f[0] = 0;
        for (int i = 1; i <= s.length(); ++i) {
            f[i] = Integer.MAX_VALUE;
            for (int j = 1; j <= i; ++j) {
                if (s.charAt(j - 1) == '0') {
                    continue;
                }
                long num = Long.parseLong(s.substring(j - 1, i), 2);
                if (isPower(num)) {
                    f[i] = Math.min(f[i], f[j - 1] + 1);
                }
            }
        }
        return f[s.length()] == Integer.MAX_VALUE ? -1 : (int) f[s.length()];
    }

    private boolean isPower(long val) {
        if (val == 0) {
            return false;
        }
        int n = (int) (Math.log(val) / Math.log(5));
        return Math.pow(5, n) == val;
    }

    public static void main(String[] args) {
        Power b = new Power();
        System.out.println(b.numsOfWays("111011100110101100101110111")); // 5
        System.out.println(b.numsOfWays("11111111111111111111111111111111111111111111111111")); // 50
    }
}

您能否显示示例输入和预期输出?这将使您的问题更容易理解。在您发布的代码中,parseInt()不是整数,示例输入:1110111100110101100101110111,其输出必须是:5如果我没有错误计算数字,111011110011010110010111011100000这个数字太大,无法放入
int
@TimBiegeleisen示例代码:11111111111111111111111111111111111回答:50您使用的是哪种语言/编译器?在Java 8上运行得非常好,包括在线和本地机器。。
public class Power {
    public int numsOfWays(String s) {
        long[] f = new long[s.length() + 1];
        f[0] = 0;
        for (int i = 1; i <= s.length(); ++i) {
            f[i] = Integer.MAX_VALUE;
            for (int j = 1; j <= i; ++j) {
                if (s.charAt(j - 1) == '0') {
                    continue;
                }
                long num = Long.parseLong(s.substring(j - 1, i), 2);
                if (isPower(num)) {
                    f[i] = Math.min(f[i], f[j - 1] + 1);
                }
            }
        }
        return f[s.length()] == Integer.MAX_VALUE ? -1 : (int) f[s.length()];
    }

    private boolean isPower(long val) {
        if (val == 0) {
            return false;
        }
        int n = (int) (Math.log(val) / Math.log(5));
        return Math.pow(5, n) == val;
    }

    public static void main(String[] args) {
        Power b = new Power();
        System.out.println(b.numsOfWays("111011100110101100101110111")); // 5
        System.out.println(b.numsOfWays("11111111111111111111111111111111111111111111111111")); // 50
    }
}
5
50