Java 如何减少Q12项目的运行时间

Java 如何减少Q12项目的运行时间,java,Java,我的代码运行时间太长。我试着做的是一路循环到一个大数字,然后循环ip到它,找到它的和,然后循环检查除数。我如何优化它 public class Q12 { public static void main(String[] args) { int answer=5; Boolean check=false; int sum=0; int counter=0; int kk=0; w

我的代码运行时间太长。我试着做的是一路循环到一个大数字,然后循环ip到它,找到它的和,然后循环检查除数。我如何优化它

public class Q12
{

    public static void main(String[] args) 
    {

        int answer=5;
        Boolean check=false;
        int sum=0;
        int counter=0;
        int kk=0;
        while(check==false)
        {
            loop:
            for(int i=1;i<50000000;i++)
            {
                sum=0;
                counter=0;

                for(int j=0;j<i;j++)
                {
                    sum=j+sum;
                }

                for(int k=1;k<sum;k++)
                {
                    if(sum%k==0)
                    {
                        counter=counter+1;
                    }

                }

                if(counter>=501)
                {
                    check=true;
                    break loop;
                }


            }


        }



    }

}
公共类Q12
{
公共静态void main(字符串[]args)
{
int-answer=5;
布尔检查=假;
整数和=0;
int计数器=0;
int kk=0;
while(check==false)
{
循环:
对于(int i=1;i
  • 你的代码应该做什么并不明显,所以我怀疑我能在那里优化什么

  • 这部分:

    check=true;
    break loop;
    
    中断执行并跳转到

    loop:
    for(int i=1;i<50000000;i++)
    
    您可以使用缓存。例如:

    long[] precalc = new long[50000000];
    
    int answer=5;
    Boolean check=false;
    int sum=0;
    int counter=0;
    int kk=0;
    while(check==false)
    {
        loop:
        for(int i=1;i<50000000;i++)
        {
            sum = precalc [i];
            if (sum == 0) {
                precalc[i] = sum = (precalc[i - 1] + i);
            }
    
            counter=0;
    
            ...
    
    long[]precalc=新长[50000000];
    int-answer=5;
    布尔检查=假;
    整数和=0;
    int计数器=0;
    int kk=0;
    while(check==false)
    {
    循环:
    
    对于(int i=1;使用一些数学进行优化,例如,a和b之间的所有整数值之和应该很容易计算,无需循环。每次循环
    i
    时,您都从
    0
    重新计算总和,只需将其存储在循环外,并在每次循环迭代时添加
    i
    。此外,您不需要启动de>i
    at
    1
    。有更有效的方法来获取数字的因子,而不是逐个进行测试。例如,如果您知道
    2
    是一个因子,那么您也会知道
    n/2
    是一个因子。此外,您可以在
    sum/2
    处停止
    k
    ,因为这是可能的最大因子(不包括号码本身)。
    long[] precalc = new long[50000000];
    
    int answer=5;
    Boolean check=false;
    int sum=0;
    int counter=0;
    int kk=0;
    while(check==false)
    {
        loop:
        for(int i=1;i<50000000;i++)
        {
            sum = precalc [i];
            if (sum == 0) {
                precalc[i] = sum = (precalc[i - 1] + i);
            }
    
            counter=0;
    
            ...