在不使用Math.pow()

时间:2015-09-29 01:35:42

标签: java eclipse exponent

这是我遇到的问题:

创建传递两个正整数的方法lastDigit。第一个整数是基数,第二个整数是指数。 lastDigit将返回base ^ exponent的最后一位数。在编写代码之前需要先考虑一下。提示:您不需要实际找到base ^ exponent的产品。

然后我需要使用该方法找到以下问题的答案:

1)3 ^ 400的最后一位数是多少? 2)(3 ^ 0)(3 ^ 1)(3 ^ 2)(3 ^ 3)......(3 ^ 10)的最后一位是什么? 3)(3 ^ 0)(3 ^ 1)(3 ^ 2)......(3 ^ 400)的乘积的最后一位是什么?

这是我写的代码:

public static int lastDigit(int m, int n){
    int p=1;
    for(int i=1; i<=n; i++)
        p=p*m;
    return p%10;
}

然而,当我试图找到问题的答案时,我对第一和第三个问题都持续-1,第二个问题则为1。代码有问题,或者我怎样才能得到正确的答案?

2 个答案:

答案 0 :(得分:2)

您或您编写的程序可能会遇到整数溢出。

这是由int类型的长期限制引起的。

症状包括

  • 真正应该是正面的负整数

  • 应该很大的小数字

可以通过确保int值不超过20亿来控制此情况。

如果症状仍然存在,请参阅调试器或打印出中间值。

*副作用可能包括沮丧,将您的计算机从窗口中剔除,和/或删除重要的系统文件。

但在所有现实中,假设你有7个基数。

7 = 7

7 * 7 = 49

49 * 7 = 343

最后一位是3。

但是,如果您,只在操作之间取最后一位数,

7 * 7 = 49 - &gt; 9

9 * 7 = 63

最后一位数仍然是三位。

这样做可以使数字远远低于int限制。

这实际上是p=(p*m)%10;解决方案的内容:

p=           (p*m)                                    %10      
  multiply the previous digit by the exponent      take the last digit

答案 1 :(得分:1)

int变量溢出。尝试将p=p*m更改为p=(p*m)%10