这是给我的问题:
创建传递两个正整数的lastDigit方法。第一个整数是底数,第二个整数是指数。lastDigit将返回底数^指数的最后一位。在编写代码之前,您需要考虑一下。提示:实际上不需要求底数^指数的乘积
然后我需要用这个方法找到下面问题的答案:
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。代码是否有问题,或者我如何得到正确的答案?
您或您编写的程序可能出现整数溢出。
这是由于int
型的慢性限制所致。
症状包括
-
应该是正数的负整数
-
应该是大的小数字
这种情况可以通过确保您的int
值不超过20亿来控制。
如果症状持续存在,请查看调试器,或打印出中间值。
*的副作用可能包括沮丧,把你的电脑扔出窗外,和/或删除重要的系统文件。
但实际上,假设你的底数是7
7 = 77 * 7 = 49
49 * 7 = 343
最后一位是3
但是,如果只取两个操作之间的最后一位,
7*7 =49 -> 9
9 * 7 = 63
最后一位仍然是3。
这样做可以使数字远远低于int
限制。
这是p=(p*m)%10;
溶液的实际情况:
p= (p*m) %10
multiply the previous digit by the exponent take the last digit
int变量溢出。尝试将p=p*m
更改为p=(p*m)%10
。