我正在尝试编写一个JAVA代码来输入这些数字
7,87,387,5387,95387,195387,4195387,64195387,464195387,2464195387,62464195387,262464195387,7262464195387,27266464195387,627262464195387,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);
}
}}
请告诉我有什么不对
答案 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
因为它具有较大范围并获得精确值。