Java 如何找出这两种代码之间的差异?两者在执行时给出相同的答案,但网站称其中一个代码部分正确

Java 如何找出这两种代码之间的差异?两者在执行时给出相同的答案,但网站称其中一个代码部分正确,java,Java,问题是计数总设置位: 我的解决办法是: public class Solution { public int solve(int A) { long sum=0; long a=A+1; for(int i=0;i<32;i++){ sum=sum+(((a/(int)Math.pow(2,i)))*(int)Math.pow(2,i-1) + (int)Math.max(0, a%(int)Math.pow(

问题是计数总设置位:

我的解决办法是:

public class Solution {
    public int solve(int A) {
        long sum=0;
        long a=A+1;
        for(int i=0;i<32;i++){
            sum=sum+(((a/(int)Math.pow(2,i)))*(int)Math.pow(2,i-1) + (int)Math.max(0, a%(int)Math.pow(2,i+1)-(int)Math.pow(2,i)));
        }
        return (int)sum%1000000007;
    } }
公共类解决方案{
公共整数解算(整数A){
长和=0;
长a=a+1;

对于(int i=0;i代码中的问题如下:

(int)Math.pow(2,i)

i
为31时,这将溢出,因为2^31对于一个int来说太小了(最大的int为2^31-1)。另一个解决方案通过在除法之后才进行强制转换来解决这个问题。

但是在他们使用的另一个解决方案中,val2=val2-(int)Math.pow(2,i-1);其中可以溢出(int)Math.pow(2,i-1)不是吗?不,因为只有2^30。谢谢,现在我明白了。祝你度过愉快的一天!
(int)Math.pow(2,i)