这是我遇到的问题:
创建传递两个正整数的方法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。代码有问题,或者我怎样才能得到正确的答案?
答案 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
。