SPOJ因子问题

时间:2011-07-25 06:27:44

标签: java

我正在尝试为SPOJ阶乘问题编号11开发代码。以下是我的代码

import java.math.*; 
import java.io.*;
public class Problem11 {

/**
 * Count the number of zeroes at the end of 
 * the factorial value of a number.
 */
public static void main(String[] args) throws IOException
{
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 int numOfInputs=0;
 numOfInputs=Integer.parseInt(br.readLine());
 BigInteger nextNum[]=new BigInteger[numOfInputs];
 BigInteger factValue[]=new BigInteger[numOfInputs];

 //Get all the numbers to be computed
 for(int count=0;count<numOfInputs;count++)
 {
    nextNum[count]=new BigInteger(br.readLine());
 }

 //Obtain the factorial value for each number
 for(int count=0;count<numOfInputs;count++)
 {
     factValue[count]=getFact(nextNum[count]);
 }

 //Obtain the number of trailing zeroes
 for(int count=0;count<numOfInputs;count++)
 {
     //System.out.println(factValue[count]);
     System.out.println(getZeroes(factValue[count]));

 }
}


public static String getZeroes(BigInteger num) 
 {
    int numOfZeroes=0;
    while(num.remainder(BigInteger.TEN).equals(BigInteger.ZERO))
    {
        num=num.divide(BigInteger.TEN);
        numOfZeroes++;
    }
    return String.valueOf(numOfZeroes);
 }



public static BigInteger getFact(BigInteger num) 
{
    BigInteger factorial=BigInteger.ONE;    
    if(num.equals(0))
    {
      return (BigInteger.valueOf(1));
    }
    else
    {
        int count=1;
        while((BigInteger.valueOf(count).compareTo(num))<=0)        
        {               
            factorial=factorial.multiply(BigInteger.valueOf(count));
            count++;
        }
    }

    return factorial;

}

}

该代码适用于最多5位数的小延迟和最后一个数字 8735373这花费了太多时间,如果我提交我的解决方案,法官会显示编译错误。我无法弄清楚错误是什么。请查看我的代码并帮助我跟踪问题。

5 个答案:

答案 0 :(得分:4)

您可以查看此方法以查找the number of trailing zeros in n!

import java.util.*;

public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int count = in.nextInt();
        for (int i = 0; i < count; i++) {
            int n = in.nextInt();
            int result = 0;
            for (int d = 5; d <= n; d *= 5) {
                result += n / d;
            }
            System.out.println(result);
        }
    }
}

答案 1 :(得分:2)

您的方法(天真:计算实际因子值然后手动计算零)无论如何都不会通过。看看极端情况(即阶乘的上限,我甚至不认为给定的内存限制足以计算它)。从不同的方式看问题,思考真正的问题是什么,这是解决问题的艺术;)

提示:什么可以产生并在数字的末尾添加更多的0,特别是通过乘法?

答案 2 :(得分:0)

您的错误原因应该是public class Main

此外,您的代码将获得TLE,您必须注意到暴力在SPOJ上永远不会起作用。解决这个问题的方法是看到一个有趣的模式,其权力为5,最后为零的数量。

答案 3 :(得分:0)

这是C中的解决方案。我们不需要计算此问题的确切因子。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 1000000
int xpn(int x, int n){
int prod=1;
while(n){
prod*=x;
n--;
}
return prod;
}
int trail(int x){
int numZero=0;
int i=1;
int k;
for(;x/xpn(5,i);i++){
numZero+=(x/xpn(5,i));
}
return numZero;
}
int main(int argc, char **argv){
#if 1
int n;
int num[MAX];
int zero[MAX];
scanf("%d",&n);
int count=n;
int i=0;
while(count){
scanf("%d",&num[i]);
zero[i]=trail(num[i]);
printf("%d\n",zero[i]);
i++;
count--;
}
#endif
return 0;
}

答案 4 :(得分:0)

import java.util.*;
import java.lang.*;

class Main
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Scanner s = new Scanner(System.in);
        int t = s.nextInt();
        while (t-->0){
            int n = s.nextInt();
            int count = 0;
            while(n>0){
                count +=n/5;
                n/=5;
            }
            System.out.println(count);
        }

    }
}

此解决方案绝对可以正常工作。 让我解释一下。 当您提及定量能力时,有一个简短的公式可以计算任何阶乘数的尾随零。将数字直接除以5,开始加商,然后将商除以5,再加一次,直到该值开始给出常数商。请参考以下示例。如果您什至不了解,请参考任何来源的定量能力。

例如

1. 60!  60/5 = 12, 12/5 = 2, add all the quotient i.e equals to 14.
2. 500! 500/5 = 100, 100/5 = 20, 20/5 = 4, ans = 124.