Java 请帮我优化我的代码以解决codechef问题!

Java 请帮我优化我的代码以解决codechef问题!,java,optimization,Java,Optimization,我正在解决这个问题!这是一个简单的问题,但我的时间到了!看来效率还不够!请帮我优化一下 代码如下: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader

我正在解决这个问题!这是一个简单的问题,但我的时间到了!看来效率还不够!请帮我优化一下

代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        for (int i = 0; i < t; i++) {
            System.out.println((int) (Math.pow(2, (int) ((Math.log(Integer.parseInt(br.readLine()))) / (Math.log(2))))));
        }
    }
} 
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
公共班机{
公共静态void main(字符串[]args)引发IOException{
BufferedReader br=新的BufferedReader(新的InputStreamReader(System.in));
int t=Integer.parseInt(br.readLine());
for(int i=0;i
问候

沙恩沙

  • 您可以在变量中缓存
    log(2)
    ,而不是在每个周期计算它
  • 不使用
    Math.log
    ,因为您使用的是整数,所以可以通过使用
    Integer.numberOfLeadingZeros
    (请参阅),计算
    log2(x))=32-numberOfLeadingZeros(x-1)
  • numberOfLeadingZeros
    应该非常快,因为它只执行一些位级操作来执行其工作

  • 您可以在变量中缓存
    log(2)
    ,而不是在每个周期计算它
  • 不使用
    Math.log
    ,因为您使用的是整数,所以可以通过使用
    Integer.numberOfLeadingZeros
    (请参阅),计算
    log2(x))=32-numberOfLeadingZeros(x-1)

  • numberOfLeadingZeros
    应该非常快,因为它只需执行一些位级操作即可执行其工作。

    这是一场竞赛,您需要帮助吗??如果解决方案不是你提出的,你怎么能为自己感到骄傲

    无论如何,这里有一些提示:

  • 使用预先计算的值优化循环:Math.log(2)总是给出相同的答案
  • 在循环中使用StringBuffer,并在循环后仅打印一次(以验证它是否提高了性能)
  • Pow(2,INT),尝试使用位移位代替Pow:)

  • [编辑]我以前关于数学的解决方案。Pow错了,谢谢Andrea这是一场比赛,你需要帮助吗??如果解决方案不是你提出的,你怎么能为自己感到骄傲

    无论如何,这里有一些提示:

  • 使用预先计算的值优化循环:Math.log(2)总是给出相同的答案
  • 在循环中使用StringBuffer,并在循环后仅打印一次(以验证它是否提高了性能)
  • Pow(2,INT),尝试使用位移位代替Pow:)

  • [编辑]我之前关于数学的解决方案。Pow是错误的,谢谢Andrea这是为了找到下一个更低的2次方吗?有比调用任何日志函数更快的方法,例如各种位技巧。通常在2的补码表示中,正
    x
    的下一次2次幂与
    x
    相同,只有
    x
    的最高有效位集,所有其他位为零

    编辑:既然你已经确认你正在寻找下一个更低的2次方,下面是规范(无分支)位黑客:

    /** The largest power of 2 <= x.
        Only valid for positive numbers. */
    static int nextLowerPowerOf2(int x) {
        x >>>= 1;
        x |= x >> 1;
        x |= x >> 2;
        x |= x >> 4;
        x |= x >> 8;
        x |= x >> 16;
        x++;
        return x;
    }
    
    /**2的最大功率>>=1;
    x |=x>>1;
    x |=x>>2;
    x |=x>>4;
    x |=x>>8;
    x |=x>>16;
    x++;
    返回x;
    }
    
    这是为了找到下一个更低的2次方吗?有比调用任何日志函数更快的方法,例如各种位技巧。通常在2的补码表示中,正
    x
    的下一次2次幂与
    x
    相同,只有
    x
    的最高有效位集,所有其他位为零

    编辑:既然你已经确认你正在寻找下一个更低的2次方,下面是规范(无分支)位黑客:

    /** The largest power of 2 <= x.
        Only valid for positive numbers. */
    static int nextLowerPowerOf2(int x) {
        x >>>= 1;
        x |= x >> 1;
        x |= x >> 2;
        x |= x >> 4;
        x |= x >> 8;
        x |= x >> 16;
        x++;
        return x;
    }
    
    /**2的最大功率>>=1;
    x |=x>>1;
    x |=x>>2;
    x |=x>>4;
    x |=x>>8;
    x |=x>>16;
    x++;
    返回x;
    }
    
    Math.Pow(2,(a/b))!=数学能力((a/b),2)。在任何情况下,都只能预先计算分母,因为必须对分子进行评估。@JPelletier..这不是一场竞赛…这些都是在网站上练习的问题,以磨练我的技能,我是一名新手…@Shahensha好的,我对“竞赛”宣传感到困惑!我不知道codechefMath.Pow(2,(a/b))!=数学能力((a/b),2)。在任何情况下,都只能预先计算分母,因为必须对分子进行评估。@JPelletier..这不是一场竞赛…这些都是在网站上练习的问题,以磨练我的技能,我是一名新手…@Shahensha好的,我对“竞赛”宣传感到困惑!我不知道codechef@Shahensha,编辑为下一个更低的2次方添加位破解。@Shahensha,编辑为下一个更低的2次方添加位破解。