我被朋友给了一个编程问题,给我一个1000字符的数字字符串。任务是找到连续30位数的最大乘积。
虽然我的代码看起来不对,但答案看起来真的很低,为什么会这样?
下面提供了此问题的相关代码。
static String s = "2389748943892"; //... This number is actually 1000 characters.
public static void main(String[] args) {
// TODO Auto-generated method stub
int largest = 0;
for(int i = 0; i < 970; i ) {
String cur = s.substring(i, i 30);
int cur_val = 0;
for(int x = 0; x < 30; x ) {
if(x == 0) {
System.out.println(Integer.parseInt(cur.substring(0, 1)));
cur_val = Integer.parseInt(cur.substring(x, 1));
} else {
cur_val = cur_val * Integer.parseInt(cur.substring(x, x 1));
}
}
if(cur_val > largest) {
largest = cur_val;
}
System.out.println("Largest: " largest);
// should be 8876473335152640000 but is 2013265920
}
}
答案 0 :(得分:1)
编辑:Arrgh,我读的是'慢'而不是'低'...... 好的,忘了性能问题,我以为你在说。
Howver,long也不会帮助你:计算ln(9 ^ 30)/ ln(2),你得到的只是95,所以你需要96位数。然后尝试Math.BigInteger!
这是由于过度使用了substring(导致一直构造和销毁新的String对象)。因为您只对单个字符感兴趣,所以最好使用s.charAt(n)。解析也很简单:只需从你得到的字符中减去'0'即可。所以你得到:
for(int i = 0; i < 970; ++i)
{
int cur_val = 0;
for(int x = i; x < i + 30; ++x)
{
cur_val *= s.charAt(x) - '0';
}
}
/* rest as you had already */
(好吧,我省略了打印子串)。
此外,在您发布的代码中,存在一些语法错误(substring i, i 30
,显然缺少'+')并且您没有增加计数器变量(如果 this 也发生在你的代码中,你会以无限循环结束 - 但是你不会得到一个缓慢的结果,你根本就没有得到任何结果。)
你可能包含一些快捷方式(例如,如果在外循环中找到'0',你知道接下来的30次迭代的结果将为0,你可以跳过这些),给你另一个加速。