2016-09-17 35 views
0

我试图解决今天上午的Codeforces问题分区2C:http://codeforces.com/contest/716/problem/Cint打破我for循环的最大值?

此问题有可能循环高达100,000次,因此这里的参数可能高达100,000。循环似乎打破100,000路过的时候(甚至更早),i被声明为int类型:

 public void solve(int a) { 
     double x = 2; 
     double y = 0; 
     double n = 0; 
     double target = 0; 
     double lcm = 0; 
     for (int i = 1; i <= a; i++) { 
      lcm = (i + 1) * i; 
      y = ((lcm * lcm) - x)/i; 
      n = (y * i) + x; 
      if (Math.sqrt(n) % (i + 1) == 0) { 
       x = Math.sqrt(n); 
       String answer = String.format("%.0f", y); 

       System.out.println("this is i: " + i); 
       System.out.println(answer); 

      } 
     } 
    } 

下面是相关输出:

this is i: 46337 
99495281029892 
this is i: 46338 
99501722706961 
this is i: 46340 
99514606895203 
this is i: 65535 
32769 

做一个快速搜索上的堆栈溢出显示,数字65535与16位无符号整数相关,但java使用32位整数。将类型更改为double的工作原理与单纯循环100,000次并在没有代码逻辑的情况下打印一样。我知道100,000^2 IS高于最大整数限制,但是这个值永远不会在我的代码中存储为int。这里发生了什么?

+0

如果需要更大的'int'类型,可以考虑使用'long',或['BigInteger'](https://docs.oracle.com/javase/7/ docs/api/java/math/BigInteger.html) – 4castle

回答

0

下面的行的结果转换为double之前产生出界int的:

lcm = (i + 1) * i; 

以上是基本相同:

lcm = (double)((i + 1) * i); 

int temp = (i + 1) * i; 
lcm = (double) temp; 

相反尝试(首先转换为双倍,然后采取什么是近似正方形):

lcm = (i + 1.0) * i; 
+0

我只想补充一点,你的循环不会中断,它会一直持续下去,但是你的'if'不能通过,所以你没有看到任何输出。如果你在循环开始时打印,你会看到循环继续。 – Shadov