Java 指数b中的最后一位数字

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

我写这段代码是为了找到指数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();
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
}