我正在尝试解决此问题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);
}
}
}
答案 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
这只是部分结果。如您所见,您正在进行天文数计算。您需要减少这一点才能使性能易于管理。