Java &引用;方程式;对黑客银行的挑战

Java &引用;方程式;对黑客银行的挑战,java,Java,我在hackerrank.com上的“方程式”挑战中遇到了一些测试用例的问题。 这就是问题所在:。 我很确定我理解逻辑,但是我的程序中仍然有一个bug(或者我的逻辑中有一个缺陷) 公共类解决方案 { 公共静态无效标记(布尔值[]a,int i,int n)//sieve util { int num=i*2; 调用legendre(13139946349)时(num),变量k溢出 将此变量的类型从int更改为long 顺便说一句,您可以通过在循环中添加断言来轻松跟踪它: if (k <

我在hackerrank.com上的“方程式”挑战中遇到了一些测试用例的问题。 这就是问题所在:。
我很确定我理解逻辑,但是我的程序中仍然有一个bug(或者我的逻辑中有一个缺陷)

公共类解决方案
{
公共静态无效标记(布尔值[]a,int i,int n)//sieve util
{
int num=i*2;

调用legendre(13139946349)
时(num),变量
k
溢出

将此变量的类型从
int
更改为
long


顺便说一句,您可以通过在循环中添加断言来轻松跟踪它:

if (k < 0)
    System.out.println(k);
if(k<0)
系统输出println(k);

更改为long不起作用,我刚刚尝试过。您需要使用biginger

查看我的解决方案

public class Solutions {

    static boolean isPrime(int p) {
        boolean num = false;
        if (p == 2 || p == 3) {
            return true;
        }
        for (int j = 2; j <= Math.sqrt(p); j++) {
            if (p % j == 0) {
                num = false;
                break;
            } else {
                num = true;
            }
        }
        return num;
    }

    public static void main(String[] args) {
        long mod = 1000007;
        int n;
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        BigInteger bresult = BigInteger.ONE;
        long x = n;
        for (int i = 2; i <= x; i++) {
            if (isPrime(i)) {
                int k = 1;
                long power = 0;
                while ((Math.pow(i, k) <= x)) {

                    power += n / Math.pow(i, k);

                    k++;
                }
                bresult = bresult.multiply(BigInteger.valueOf(power * 2 + 1));
            }

        }
        System.out.println(bresult.mod(BigInteger.valueOf(mod)));

    }
}
公共类解决方案{
静态布尔isPrime(int p){
布尔数=假;
如果(p==2 | | p==3){
返回true;
}

对于(int j=2;j)您是否有可能出现溢出?如果您更改int(可能变大的int)很长时间以来,你还看到类似的结果吗?哇。我真的不敢相信这是有效的。我做了这么多数学编程挑战,我一直在思考溢出问题,但我真的认为我在这里是安全的。感谢你对meNo问题的容忍。我很高兴它真的那么简单,我没有比atm机更多的脑力。
public class Solutions {

    static boolean isPrime(int p) {
        boolean num = false;
        if (p == 2 || p == 3) {
            return true;
        }
        for (int j = 2; j <= Math.sqrt(p); j++) {
            if (p % j == 0) {
                num = false;
                break;
            } else {
                num = true;
            }
        }
        return num;
    }

    public static void main(String[] args) {
        long mod = 1000007;
        int n;
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        BigInteger bresult = BigInteger.ONE;
        long x = n;
        for (int i = 2; i <= x; i++) {
            if (isPrime(i)) {
                int k = 1;
                long power = 0;
                while ((Math.pow(i, k) <= x)) {

                    power += n / Math.pow(i, k);

                    k++;
                }
                bresult = bresult.multiply(BigInteger.valueOf(power * 2 + 1));
            }

        }
        System.out.println(bresult.mod(BigInteger.valueOf(mod)));

    }
}