连续30位数的最大产品

时间:2016-04-26 12:45:03

标签: java

我被朋友给了一个编程问题,给我一个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

    }
  }

1 个答案:

答案 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,你可以跳过这些),给你另一个加速。