java - 如何减少查找数字阶乘的最后一个非零数字的运行时间?

标签 java c time-complexity factorial

我有一个问题,我必须找到一个数字的阶乘的最后一个非零数字。我对 Java 和 C 使用了相同的代码,但两者花费的时间不同。

int lastDigitDiffZero(long n) {

     int dig[] = {1, 1, 2, 6, 4, 2, 2, 4, 2, 8};
     int i=(int) n;

     if (n < 10)
       return dig[i]; 

     if (((n/10)%10)%2 == 0)
       return (6*lastDigitDiffZero(n/5)*dig[(int)n%10]) % 10;
     else
       return (4*lastDigitDiffZero(n/5)*dig[(int)n%10]) % 10;
}

我想知道为什么需要不同的时间,我应该怎么做才能减少运行时间?

最佳答案

请查找优化版本:

private static final int DIG[] = { 1, 1, 2, 6, 4, 2, 2, 4, 2, 8 };

static int lastDigitDiffZero(long n) {
        if (n < 10)
            return DIG[(int) n];
        int t1 = (int) (n % 10);
        int t2 = lastDigitDiffZero(n / 5) * DIG[t1];
        if (((n / 10) % 10) % 2 == 0) {
            return (6 * t2) % 10;
        } else
            return (4 * t2) % 10;
}

关于java - 如何减少查找数字阶乘的最后一个非零数字的运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48420368/

相关文章:

c - 如何为 IAR Embedded Workbench 项目配置 Ceedling?

arrays - 在数组中找到一个非重复元素?

c - 使用 stat() 获取文件类型的替代方法?

java - 检查链表中子列表的方法的时间复杂度

algorithm - 条件变化时嵌套 while 的时间复杂度

java - 如何防止使用 Java 泛型检查根类?

java - Google 应用引擎无法创建 DevAppServer

java - JLabel 图标抗拒改变

添加背景图像时 Java 游戏速度变慢

c - x86 上的简单 PAPI 分析中意外出现大量 TLB 未命中