Java程序需要很长时间

时间:2017-06-27 18:30:23

标签: java

我正在尝试解决此问题Question

  

问题:

     

对于每个正数nn,我们定义函数   streak(n)= kstreak(n)= k作为最小的正整数k,使得   n + k不能被k + 1整除。例如:13可以被1 14整除   可被2整除15可被16整除16可被4整除17不可   可被5整除所以条纹(13)= 4。同样:120可以被1整除   121不能被2整除所以条纹(120)= 1。

     

将P(s,N)定义为整数nn,1      

找出P(i,4 ^ {i})的总和,因为ii的范围是1到31。

此代码需要很长时间才能完成。减少所需时间的可能方法是什么?

我的代码如下:

public class Main {
    public static long streak(long n){

        if(n%2 == 0){
            return 1l;
        }

        long count=0;
        for (int i=1;i<1000;i++){
            if (n%i==0){
                n++;
            }else {
                break;
            }
            count++;
        }
        return count;
    }

    public static long function (long s, long N){
        long count=0;
        for (long n=2;n<N;n++){
            if(streak(n) == s)
                count++;
        }
        return count;
    }

    public static void main(String[] args) {
        long sum=0;
        System.out.println("Streak of 13 = "+streak(13));
        System.out.println("Streak of 120 = "+streak(120));
        System.out.println("P(6,1000000)= "+function(6,1000000));
        long powVal = 0l;
        long n = 0l;
        for (long i=1;i<32;i++){
            powVal = (long) Math.pow(4,i);

            for (n = 2; n < powVal; n++){
                if(streak(n) == i)
                    sum++;
            }

            long funcRet = function(i, powVal);
            sum+= funcRet;
            System.out.println("P("+i+","+powVal+") = " + funcRet);
            System.out.println("SUM : " +sum);

//              System.out.println("SUM for " + i + " = " +sum);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是您正在进行的大量操作。正如我在评论中指出的那样,您仅在main的前3行中就进行了超过5亿次操作。

我还使用了跟踪语句来查明你在后半部分执行了多少操作(我笨拙地命名了操作的总数s):

long s = 1;
        for (long i = 1; i < 32; i++)
        {
            s = 1;
            long powVal = (long)Math.Pow(4, i);

            Trace.TraceInformation("powVal: " + powVal);

            for (int n = 2; n < powVal; n++)
            {
                // Each call to streak could entail 1000 operations
                s *= 1000;
                Trace.TraceInformation("s: " + s.ToString());
            }
        }

以下是部分结果:

VB Parser.vshost.exe Information: 0 : powVal: 4
VB Parser.vshost.exe Information: 0 : s: 1000
VB Parser.vshost.exe Information: 0 : s: 1000000
VB Parser.vshost.exe Information: 0 : powVal: 16
VB Parser.vshost.exe Information: 0 : s: 1000
VB Parser.vshost.exe Information: 0 : s: 1000000
VB Parser.vshost.exe Information: 0 : s: 1000000000
VB Parser.vshost.exe Information: 0 : s: 1000000000000
VB Parser.vshost.exe Information: 0 : s: 1000000000000000
VB Parser.vshost.exe Information: 0 : s: 1000000000000000000
VB Parser.vshost.exe Information: 0 : s: 3875820019684212736
VB Parser.vshost.exe Information: 0 : s: 2003764205206896640

这只是部分结果。如您所见,您正在进行天文数计算。您需要减少这一点才能使性能易于管理。