欧拉计划 N# 8 JAVA
Project Euler N# 8 JAVA
我正在尝试解决 this problem 我认为我在正确的轨道上,但由于某些原因,该程序在特定条件下不 运行。
这是代码:
public class Eight {
public static void main(String[] args) {
String set = "731671765313306249192251196744265747423"
+ "553491949349698352031277450632623957831801698"
+ "480186947885184385861560789112949495459501737958"
+ "331952853208805511125406987471585238630507156932909"
+ "632952274430435576689664895044524452316173185640309871"
+ "112172238311362229893423380308135336276614282806444486645"
+ "238749303589072962904915604407723907138105158593079608"
+ "66701724271218839987979087922749219016997208880937"
+ "7665727333001053367881220235421809751254540594752"
+ "243525849077116705560136048395864467063244157221"
+ "55397536978179778461740649551492908625693219784"
+ "686224828397224137565705605749026140797296865"
+ "241453510047482166370484403199890008895243450"
+ "6585412275886668811642717147992444292823086346567481391912316282458617866458"
+ "3591245665294765456828489128831426076900422421902267105562632111110937054421750694165"
+ "8960408071984038509624554443629812309878799272442849091888458015616609791913387549920052"
+ "4063689912560717606058861164671094050775410022569831552000559357297257163626956188267042"
+ "8252483600823257530420752963450";
int initialIndex = 0;
int lastIndex = 4;
int finale = 0;
for (;last <= set.length() - 1; initialIndex++, lastIndex++)
{
int num = Integer.parseInt(set.substring(initialIndex, lastIndex));
int result = 1;
while (num > 0)
{
int digit = num % 10;
result *= digit;
num /= 10;
}
if (result > finale)
finale = result;
} //end for
System.out.println(finale);
}
}
当lastIndex等于4时,我得到的结果是5832,这和Project Euler给你举例的结果是一样的。但是当我尝试 运行 这个程序用 13 个数字而不是 4 个时,我得到一个异常并且程序没有 运行。
13 位数字的字符串将超过 int 的最大允许大小。使用 Long.parseLong
并将 num
从 int
更改为 long
。我做到了,当我使用13位数字时得到以下结果:2091059712
您的问题从这里开始:
int num = Integer.parseInt(set.substring(initialIndex, lastIndex));
当你设置lastIndex
为13时,你要从字符串中取出的数字是7,316,717,653,133。在您的代码中,您试图将 String
解析为 int
,其最大值为 2^31
2,147,483,647。
您可以通过将任何希望超过 2^31 的变量设为不同的整数数据类型来解决您的问题,例如 long
.
我正在尝试解决 this problem 我认为我在正确的轨道上,但由于某些原因,该程序在特定条件下不 运行。 这是代码:
public class Eight {
public static void main(String[] args) {
String set = "731671765313306249192251196744265747423"
+ "553491949349698352031277450632623957831801698"
+ "480186947885184385861560789112949495459501737958"
+ "331952853208805511125406987471585238630507156932909"
+ "632952274430435576689664895044524452316173185640309871"
+ "112172238311362229893423380308135336276614282806444486645"
+ "238749303589072962904915604407723907138105158593079608"
+ "66701724271218839987979087922749219016997208880937"
+ "7665727333001053367881220235421809751254540594752"
+ "243525849077116705560136048395864467063244157221"
+ "55397536978179778461740649551492908625693219784"
+ "686224828397224137565705605749026140797296865"
+ "241453510047482166370484403199890008895243450"
+ "6585412275886668811642717147992444292823086346567481391912316282458617866458"
+ "3591245665294765456828489128831426076900422421902267105562632111110937054421750694165"
+ "8960408071984038509624554443629812309878799272442849091888458015616609791913387549920052"
+ "4063689912560717606058861164671094050775410022569831552000559357297257163626956188267042"
+ "8252483600823257530420752963450";
int initialIndex = 0;
int lastIndex = 4;
int finale = 0;
for (;last <= set.length() - 1; initialIndex++, lastIndex++)
{
int num = Integer.parseInt(set.substring(initialIndex, lastIndex));
int result = 1;
while (num > 0)
{
int digit = num % 10;
result *= digit;
num /= 10;
}
if (result > finale)
finale = result;
} //end for
System.out.println(finale);
}
}
当lastIndex等于4时,我得到的结果是5832,这和Project Euler给你举例的结果是一样的。但是当我尝试 运行 这个程序用 13 个数字而不是 4 个时,我得到一个异常并且程序没有 运行。
13 位数字的字符串将超过 int 的最大允许大小。使用 Long.parseLong
并将 num
从 int
更改为 long
。我做到了,当我使用13位数字时得到以下结果:2091059712
您的问题从这里开始:
int num = Integer.parseInt(set.substring(initialIndex, lastIndex));
当你设置lastIndex
为13时,你要从字符串中取出的数字是7,316,717,653,133。在您的代码中,您试图将 String
解析为 int
,其最大值为 2^31
2,147,483,647。
您可以通过将任何希望超过 2^31 的变量设为不同的整数数据类型来解决您的问题,例如 long
.