微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如果我以有效的方式找到一个大数的阶乘,但仍然得到 TLE,我该怎么办?

如何解决如果我以有效的方式找到一个大数的阶乘,但仍然得到 TLE,我该怎么办?

问题:超长阶乘(https://www.hackerrank.com/challenges/extra-long-factorials/problem) 约束:1

当我提交显示 TLE 的代码时,我正在以一种有效的方式加上它在网络中仍然可用的相同解决方案。 下面是我的代码

public static void multiply(ArrayList<Integer> prod,int i)
    {
        int carry=0;
        for(int j=0;j<prod.size();j++)
        {
            int currp=prod.get(j)*i+carry;
            prod.add(j,currp%10);
            carry=currp/10;
        }
        while(carry>0)
        {
            prod.add(carry%10);
            carry/=10;
        }
    }
    // Complete the extraLongFactorials function below.
    static void extraLongFactorials(int n) {

        ArrayList<Integer> prod= new ArrayList<>();
        prod.add(1);
        for(int i=2;i<n;i++)
        multiply(prod,i);
        
        for(int i=prod.size()-1;i>=0;i--)
        System.out.print(prod.get(i));
        
        System.out.println();
    }

解决方法

Java 具有提供任意精度的内置类。使用 BigInteger.valueOf(long)BigInteger.multiply(BigInteger) like

static void extraLongFactorials(int n) {
    BigInteger v = BigInteger.valueOf(n);
    while (--n > 0) {
        v = v.multiply(BigInteger.valueOf(n));
    }
    System.out.println(v);
}
,

您的代码有一些严重的错误。

我测试它是将它粘贴到一个类中并添加一个主要方法:

public static void main(String[] args) {
    for (int i = 1; i <= 10; i++) {
        extraLongFactorials(i);
    }
}
  • 您的代码返回 1 阶乘的正确结果。
  • 您的代码返回“1”作为 2 的阶乘,这是错误的(应该是“2”)
  • 您的代码无法计算 3 的阶乘 - 它永远不会停止

我故意不纠正您的错误 - 尝试自己查找并修复它们(使用调试器)。

好消息:您的代码中有两个错误。解决这些问题,您的代码将通过测试。

,

所以我在代码中犯了两个错误。 现在我的代码已提交。 下面是正确的代码-

public static void multiply(ArrayList<Integer> prod,int i)
    {
        int carry=0;
        for(int j=0;j<prod.size();j++)
        {
            int currp=prod.get(j)*i+carry;
            prod.set(j,currp%10);
            carry=currp/10;
        }
        while(carry>0)
        {
            prod.add(carry%10);
            carry/=10;
        }
    }
    // Complete the extraLongFactorials function below.
    static void extraLongFactorials(int n) {

        ArrayList<Integer> prod= new ArrayList<>();
        prod.add(1);
        for(int i=1;i<=n;i++)
        multiply(prod,i);
        
        for(int i=prod.size()-1;i>=0;i--)
        System.out.print(prod.get(i));
        
        System.out.println();
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。