【问题标题】:Find first non zero number in N! in Java在 N 中找到第一个非零数!在 Java 中
【发布时间】:2015-09-17 01:58:41
【问题描述】:

如何找到 N 的阶乘的第一个非零数。N 可以在 1 到 2147483647 的范围内。输出返回一个整数。

前:

findFirstNoneZeroNumberOfTheFactorial(4) = 4; // because 4! = 24
findFirstNoneZeroNumberOfTheFactorial(5) = 2; // because 5! = 120

这是我的代码:

import java.math.BigInteger;

public class Solution {
    public static int findFirstNoneZeroNumberOfTheFactorial(int n) {
        BigInteger fact = null;
        for (int i = 1; i <= n; i++) {
            fact = fact.multiply(BigInteger.valueOf(i));
        }
        String sFact = String.valueOf(fact);
        for (int i = sFact.length() - 1; i >= 0; i--) {
            if (sFact.charAt(i) != '0') {
                int result = Character.getNumericValue(sFact.charAt(i));
                return result;
            }
        }
        return 0;
    }
    public static void main(String[] args){
        System.out.println(Solution.findFirstNoneZeroNumberOfTheFactorial(4));
    }
}

但是不行!!

【问题讨论】:

  • 你的意思是第一个非零数字吗?
  • 是的,从右到左找到第一个非零数字。

标签: java string math biginteger


【解决方案1】:

您的初始化不正确。

BigInteger fact = BigInteger.ONE;

这不是最优的。 如果您只需要最后一个非零数字,只需跟踪最后一个非零数字而不是整个相乘数字。

let's do some math
x     x!      last-nonzero-digit(x * last-nonzero-digit)
1     1             1*1        => 1
2     2             2*1 = 2    => 2
3     6             3*2 = 6    => 6 
4     24            6*4 = 2(4) => 4
5     120           4*5 = (2)0 => 2 
6     720           2*6 = 1(2) => 2
7     5040          2*7 = 1(4) => 4

为什么我必须计算整个乘法?

只保留最后一个非零数字。

【讨论】:

  • 很好!!我得到了它!!非常感谢@Uma Kanth!
  • @samgak 是的。这要好得多。但我没有找到一个重复的循环。
  • @UmaKanth 没有模式,我的错误:math.stackexchange.com/questions/100544/…
  • @UmaKanth 根据您的方法,我们需要对前一个数字的最后一位负责。这怎么比蛮力好?
  • @FallAndLearn 蛮力需要计算整个阶乘。 1000!阶乘中有 2568 位数字。这需要大量的计算能力,而最大 9*9 中只有 2 位数字。
【解决方案2】:

您忘记初始化您的fact 变量,这导致NullPointerException

改变

BigInteger fact = null;

BigInteger fact = BigInteger.ONE;

System.out.println(Solution.findFirstNoneZeroNumberOfTheFactorial(4)); 的输出:

4

【讨论】:

    【解决方案3】:

    不要将它转换为模块操作的字符串检查,如果它不为零,这就是你的答案,否则除以 10。

    public static int findFirstNoneZeroNumberOfTheFactorial(int n) {
        long fact = 1L;
        for (int i = 1; i <= n; i++) {
            fact = fact * i;
        }
        while (fact > 0) {
            long module = fact % 10;
            if (module != 0) {
                return module;
            }
            fact = fact / 10;
        }
        return -1;
    
    }
    

    【讨论】:

    • 但是这种方式,它不适用于像 99 这样的大数字! .
    • 这个问题不需要。 long 足够大,而且在内存中速度更快,成本更低
    • 对不起,我误解了这个问题。 N 可以在 1 到 2147483647 的范围内,而不是 N!如此正确,您必须使用 BigInteger
    • 可以用 BigInteger 重写 % 和 / 运算符替换为对应的 mod 和除法方法
    • 无论如何,谢谢你的回答! :)
    【解决方案4】:

    这样对吗??

    public static int number(int n) {
            int LastNoneZero = 1;
            for (int i = 1; i <= n; i++) {
                LastNoneZero *= i;
                if (LastNoneZero > 9) {
                    String s = Integer.toString(LastNoneZero);
                    if (s.charAt(1) == '0') {
                        LastNoneZero = Character.getNumericValue(s.charAt(0));
                    } else {
                        LastNoneZero = Character.getNumericValue(s.charAt(1));
                    }
                }
            }
            return LastNoneZero;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多