Java(Eclipse)可以';我似乎无法处理我的大型迭代!用于EULER'的扰流板;第七
这是我关于Euler第七个问题的代码Java(Eclipse)可以';我似乎无法处理我的大型迭代!用于EULER'的扰流板;第七,java,eclipse,Java,Eclipse,这是我关于Euler第七个问题的代码 public static void main(String[] args) { int desiredMax = 1000000; int maxNumberOfTerms = 0; int maxTerm = 0; for(int startingNumber = 1; startingNumber<=desiredMax;startingNumber++) { int numberOfTer
public static void main(String[] args) {
int desiredMax = 1000000;
int maxNumberOfTerms = 0;
int maxTerm = 0;
for(int startingNumber = 1; startingNumber<=desiredMax;startingNumber++) {
int numberOfTerms = 1;
int currentNumber = startingNumber;
while(currentNumber!= 1) {
if(currentNumber%2 == 0) {
currentNumber = currentNumber/2;
numberOfTerms++;
} else {
currentNumber = (3 * currentNumber) + 1;
numberOfTerms++;
}
}
if(numberOfTerms > maxNumberOfTerms) {
maxNumberOfTerms = numberOfTerms;
maxTerm = startingNumber;
}
}
System.out.print(maxNumberOfTerms + " " + maxTerm);
}
不要尝试使用递归函数方法来解决这个问题,使用蛮力算法最终将无法计算大输入。您的
currentNumber
变量溢出int
数据类型,变成负数,并导致代码进入无限循环
要解决此问题,请像这样声明变量(在原始循环代码中):
现在,int desiredMax=1000000
(一百万)的计算可以很快完成
当currentNumber
是数据类型int
时,以下是导致无限循环的值的级数(从上到下读取,然后从左到右):
请注意,索引236处的最后一个值与索引218处的值相同。您能提供更多信息吗?停止是什么意思?它是抛出错误还是代码只是停止处理?如果它只是停止,它总是在同一个数字吗?你能告诉我们你得到的确切的
Exception
吗?老实说,在我看来这是个大问题。也许它并没有停止,只是计算起来太长了。尝试添加打印语句。你有例外吗?它也可能已经用完了内存。据我所知,已更新。如果内存不足,我该如何修复它?这意味着您需要更好的解决方案!这些问题是专门为阻止暴力O(n^2)解决方案而设计的。尝试过递归,仍然没有问题:(我想gknicker已经给了你答案,你正在用你的当前数字溢出int类型:)
package Euler;
public class Euler14 {
static int desiredMax = 1000000;
static int maxTerm = 0;
static int maxNumberOfTerms = 0;
static int currentNumber = 0;
static int numberOfTerms = 0;
public static void doMath(int startingNumber) {
if(startingNumber == 1) {
System.out.print( maxTerm + " " + maxNumberOfTerms);
}
else {
currentNumber = desiredMax;
while(currentNumber!= 1) {
if(currentNumber%2 == 0) {
currentNumber = currentNumber/2;
numberOfTerms++;
} else {
currentNumber = (3 * currentNumber) + 1;
numberOfTerms++;
}
}
numberOfTerms++;
if(numberOfTerms > maxNumberOfTerms) {
maxNumberOfTerms = numberOfTerms;
maxTerm = startingNumber;
}
desiredMax--;
doMath(desiredMax);
}
}
public static void main(String[] args) {
doMath(desiredMax);
}
}
long currentNumber = startingNumber;
113383 1379177 2795998 204058582 -1812855948 -102088288 -4435 -248
340150 4137532 1397999 102029291 -906427974 -51044144 -13304 -124
170075 2068766 4193998 306087874 -453213987 -25522072 -6652 -62
510226 1034383 2096999 153043937 -1359641960 -12761036 -3326 -31
255113 3103150 6290998 459131812 -679820980 -6380518 -1663 -92
765340 1551575 3145499 229565906 -339910490 -3190259 -4988 -46
382670 4654726 9436498 114782953 -169955245 -9570776 -2494 -23
191335 2327363 4718249 344348860 -509865734 -4785388 -1247 -68
574006 6982090 14154748 172174430 -254932867 -2392694 -3740 -34
287003 3491045 7077374 86087215 -764798600 -1196347 -1870 -17
861010 10473136 3538687 258261646 -382399300 -3589040 -935 -50
430505 5236568 10616062 129130823 -191199650 -1794520 -2804 -25
1291516 2618284 5308031 387392470 -95599825 -897260 -1402 -74
645758 1309142 15924094 193696235 -286799474 -448630 -701 -37
322879 654571 7962047 581088706 -143399737 -224315 -2102 -110
968638 1963714 23886142 290544353 -430199210 -672944 -1051 -55
484319 981857 11943071 871633060 -215099605 -336472 -3152 -164
1452958 2945572 35829214 435816530 -645298814 -168236 -1576 -82
726479 1472786 17914607 217908265 -322649407 -84118 -788 -41
2179438 736393 53743822 653724796 -967948220 -42059 -394 -122
1089719 2209180 26871911 326862398 -483974110 -126176 -197 -61
3269158 1104590 80615734 163431199 -241987055 -63088 -590 -182
1634579 552295 40307867 490293598 -725961164 -31544 -295 -91
4903738 1656886 120923602 245146799 -362980582 -15772 -884 -272
2451869 828443 60461801 735440398 -181490291 -7886 -442 -136
7355608 2485330 181385404 367720199 -544470872 -3943 -221 -68
3677804 1242665 90692702 1103160598 -272235436 -11828 -662
1838902 3727996 45346351 551580299 -136117718 -5914 -331
919451 1863998 136039054 1654740898 -68058859 -2957 -992
2758354 931999 68019527 827370449 -204176576 -8870 -496