Java 指数b中的最后一位数字
我写这段代码是为了找到指数b的最后一位数字,但SPOJ说这是错误的。我尝试了几乎所有的测试用例,但没有找到错误。 问题: 我的解决方案:Java 指数b中的最后一位数字,java,math,java-8,factorial,Java,Math,Java 8,Factorial,我写这段代码是为了找到指数b的最后一位数字,但SPOJ说这是错误的。我尝试了几乎所有的测试用例,但没有找到错误。 问题: 我的解决方案: spoj包装; 导入java.util.Scanner; 公共类最后数字{ 公共静态void main(字符串[]args)引发java.lang.Exception{ 扫描仪p=新扫描仪(系统英寸); 对于(int test=p.nextInt();test>0;test--){ int a=p.nextInt(); int b=p.nextInt(); i
spoj包装;
导入java.util.Scanner;
公共类最后数字{
公共静态void main(字符串[]args)引发java.lang.Exception{
扫描仪p=新扫描仪(系统英寸);
对于(int test=p.nextInt();test>0;test--){
int a=p.nextInt();
int b=p.nextInt();
int result=(int)Math.pow(a,b);
系统输出打印项次(结果%10);
}
}
}
Math.pow
适用于包含所有舍入误差的浮点数。因此,即使是中等大小的a
和b
的最后一位数字也将是错误的
正如David Wallace在评论中提醒我的那样,更直接的错误是尝试将54+1位带符号整数(即使用双尾数提供的整数范围)拟合为31+1位带符号整数。溢出导致的错误发生在小于舍入错误开始位置的数字上。可以通过使用long
(int)数据类型来避免这种情况
要获得正确的解决方案,您需要使用模幂运算,或查找a
(或a%10
)幂的最后一位的周期。Math.pow
适用于具有所有舍入误差的浮点数。因此,即使是中等大小的a
和b
的最后一位数字也将是错误的
正如David Wallace在评论中提醒我的那样,更直接的错误是尝试将54+1位带符号整数(即使用双尾数提供的整数范围)拟合为31+1位带符号整数。溢出导致的错误发生在小于舍入错误开始位置的数字上。可以通过使用long
(int)数据类型来避免这种情况
要获得正确的解决方案,您需要使用模幂运算,或查找a
(或a%10
)的最后一位幂的周期。Math.pow
是浮点运算!它没有计算出确切的结果。这就是为什么你有那个有趣的演员
因此,您需要使用biginger
或编写自己的求幂函数。后者更可取,因为计算最后一个数字更有效的方法是减少模10,b模4,然后取幂,然后再次减少模10。如果浮点运算是精确的,这甚至可以在这个范围内工作
另外:如果b
为负数,您真的应该在那里检查a%10
是否甚至是可逆模10。否则,你做的模10等价于零除。Math.pow
是一个浮点运算!它没有计算出确切的结果。这就是为什么你有那个有趣的演员
因此,您需要使用biginger
或编写自己的求幂函数。后者更可取,因为计算最后一个数字更有效的方法是减少模10,b模4,然后取幂,然后再次减少模10。如果浮点运算是精确的,这甚至可以在这个范围内工作
另外:如果b
为负数,您真的应该在那里检查a%10
是否甚至是可逆模10。否则,你就要做模10除以0的等价运算。我要建议一些奇怪的方法来解决这个问题,作为一种“有趣的事实”,而不是应该使用的解决方案(至少我不认为应该这样)
你的a
是0
您的a
为0
Scanner p = new Scanner(System.in);
for (int test = p.nextInt(); test > 0; test--) {
int a = p.nextInt();
int b = p.nextInt();
int result = (int) Math.pow(a, b);
System.out.println("Result:"+result);
System.out.println("Last Digit:"+result % 10);
}
输出:
一,
二,
十四,
结果:16384
最后一位数字:4您的代码正确,工作正常:
Scanner p = new Scanner(System.in);
for (int test = p.nextInt(); test > 0; test--) {
int a = p.nextInt();
int b = p.nextInt();
int result = (int) Math.pow(a, b);
System.out.println("Result:"+result);
System.out.println("Last Digit:"+result % 10);
}
输出:
一,
二,
十四,
结果:16384
最后一个数字:4问题是你只想要最后一个数字,所以你不需要知道最终结果。关于:
int r = (a * a) % 10;
for (int n = 1; n < b - 1; n++){
r *= a;
r = r % 10;
}
intr=(a*a)%10;
对于(int n=1;n
这很有效。给我一点时间,我会详细解释的。我相信这是正确的做法
[编辑]
好吧,我不是数学家(也不擅长解释),所以没有证据,但举个例子:
四次幂,(4*4*4*4…)最后一位数字是4或6。不管你是16乘以4,还是6乘以4,甚至是256乘以4,最后一个数字都是4,关键是,你不需要整个数值来跟踪最后一个数字是什么。我不知道怎么说,但想想:
3*7=21和
27*3=(60+21)=81
对不起。我可以解释得更好。我认为这是OP希望找到的解决方案 问题是,您只需要最后一位数字,因此不需要知道最终结果。关于:
int r = (a * a) % 10;
for (int n = 1; n < b - 1; n++){
r *= a;
r = r % 10;
}
intr=(a*a)%10;
对于(int n=1;n
这很有效。给我一点时间,我会详细解释的。我相信这是正确的做法
[编辑]
好吧,我不是数学家(也不擅长解释),所以没有证据,但举个例子:
四次幂,(4*4*4*4…)最后一位数字是4或6。不管你是16乘以4,还是6乘以4,甚至是256乘以4,最后一个数字都是4,关键是,你不需要整个数值来跟踪最后一个数字是什么。我不知道怎么说,但想想:
3*7=21和
27*3=(60+21)=
fun LastDigit(a: Int, b: Int): Int {
var ld = a%10
if(ld==0 || ld==1 || ld==5 || ld==6){
return ld
}
if(ld==2 ){
val n = b%4
if(n==1)
return 2
if(n==2)
return 4
if(n==3)
return 8
if(n==0)
return 6
}
if( ld==3){
val n = b%4
if(n==1)
return 3
if(n==2)
return 9
if(n==3)
return 7
if(n==0)
return 1
}
if(ld ==7 ){
val n = b%4
if(n==1)
return 7
if(n==2)
return 9
if(n==3)
return 3
if(n==0)
return 1
}
if(ld ==8 ){
val n = b%4
if(n==1)
return 8
if(n==2)
return 4
if(n==3)
return 2
if(n==0)
return 6
}
if(ld==4){
val n = b%2
if(n==1)
return 4
if(n==0)
return 6
}
if(ld==9){
val n = b%2
if(n==1)
return 9
if(n==0)
return 1
}
return -1
}