如果我仍然以有效的方式找到大数的阶乘,我应该怎么做?
What should I do if I am finding the factorial of a big Number in an efficient way still I am getting a 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)
and BigInteger.multiply(BigInteger)
喜欢
static void extraLongFactorials(int n) {
BigInteger v = BigInteger.valueOf(n);
while (--n > 0) {
v = v.multiply(BigInteger.valueOf(n));
}
System.out.println(v);
}
您的代码有一些严重的错误。
我测试了将其粘贴到 class 并添加一个主要方法:
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
extraLongFactorials(i);
}
}
- 您的代码 returns
1
的阶乘的正确结果。
- 您的代码 returns“1”作为
2
的阶乘,这是错误的(应该是“2”)
- 您的代码无法计算
3
的阶乘 - 它永远不会停止
我故意不纠正你的错误 - 尝试自己找到并修复它们(使用调试器)。
好消息:您的代码中有两个错误。修复这些问题,您的代码将通过测试。
所以我在代码中犯了 2 个错误。
现在我的代码已提交。
下面是正确的代码-
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();
}
问题:超长阶乘(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)
and BigInteger.multiply(BigInteger)
喜欢
static void extraLongFactorials(int n) {
BigInteger v = BigInteger.valueOf(n);
while (--n > 0) {
v = v.multiply(BigInteger.valueOf(n));
}
System.out.println(v);
}
您的代码有一些严重的错误。
我测试了将其粘贴到 class 并添加一个主要方法:
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
extraLongFactorials(i);
}
}
- 您的代码 returns
1
的阶乘的正确结果。 - 您的代码 returns“1”作为
2
的阶乘,这是错误的(应该是“2”) - 您的代码无法计算
3
的阶乘 - 它永远不会停止
我故意不纠正你的错误 - 尝试自己找到并修复它们(使用调试器)。
好消息:您的代码中有两个错误。修复这些问题,您的代码将通过测试。
所以我在代码中犯了 2 个错误。 现在我的代码已提交。 下面是正确的代码-
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();
}