旅行算法抛出一个序列

时间:2015-06-19 12:50:26

标签: java

我正在尝试编写一个JAVA代码来输入这些数字

7,87,387,5387,95387,195387,4195387,6​​4195387,464195387,2464195387,6​​2464195387,262464195387,7262464195387,27266464195387,6​​27262464195387,5627262464195387,75627262464195387,575627262464195387,4575627262464195387

但是当我在netbeans上编写这段代码时,它并没有给我我想要的序列

 public class Sum30 {

    public static void main(String[] args) {
      double a;
   for(double i=2;i<100;i++){
      a=7;
   a=  (pow(3,a)%pow(10,i));
          System.out.println(a);
       }      

    }}

请告诉我有什么不对

3 个答案:

答案 0 :(得分:4)

pow(3,a)为大a个值生成巨大的数字,因此它很快(从Math.pow(3, 87)开始)产生的值超出{{1}的范围(“无限”)。

此外,您的算法完全基于整数。您不应该使用浮点数进行该计算。尤其是double的循环索引具有“气味”(即使它适用于您的情况)。

我建议将double用于循环索引,int用于BigInteger

a

请注意,public static void main(String[] args) { BigInteger a = BigInteger.valueOf(7); for (int i = 2; i < 100; i++) { a = (BigInteger.valueOf(3).pow(a.intValue()).mod(BigInteger.valueOf(10).pow(i))); System.out.println(a); } } 对指数采用pow,因此此解决方案也有限制。

为了避免此限制,您可能需要write your own pow function或使用合并的int操作。由于您事先知道取幂的结果将是一个(相对小)数的模数,您可以使用使用该知识的组合运算来执行指数更多更多有效。

modPow

除可用内存和可用处理时间外,此版本没有限制。

答案 1 :(得分:1)

您在循环中执行此计算:

 a=7;
 a=  (pow(3,a)%pow(10,i));

所以pow(3,a)总是相同的(2187),因为a总是重置为7. pow(10,1)很快变得比2187大得多,所以模数变为2187.你的数学错了,我想。

答案 2 :(得分:0)

要过度使用此类缺陷或错误,请使用BigInteger因为它具有较大范围并获得精确值。