2011-07-25 97 views
3

我試圖開發SPOJ階乘問題數11.下面的代碼是我的代碼SPOJ階乘問題

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它花費了太多時間,如果我提交我的解決方案,法官顯示編譯錯誤..我無法弄清楚錯誤是什麼。請看看我的代碼,並幫助我找出問題所在。

回答

3

您可以查看此方法來查找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); 
     } 
    } 
} 
+0

這不是那裏最快的,但它是一個開始。 – trashgod

2

你的方法(幼稚:計算實際階乘值,然後手動計算零)不會通過,無論如何。看看極端情況(即階乘的上限,我甚至不認爲給定的內存限制足以計算它)。從不同的角度看問題,思考真正的問題是什麼,這是問題解決的藝術;)

提示:什麼可以產生和添加更多0到一個數字的末尾,特別是乘法?

+0

感謝您的即時幫助,您是否可以確認我的方法是否可以獲得階乘值,這樣我就會花一段時間來獲取值的數目爲零的數目? – kunaguvarun

+0

你不需要獲得因子的值:) –

+0

正如耶穌所說,沒有。你不需要它,你只需要得到導致0的因素。另一個提示:解決方案的複雜性是O(1):) – LeleDumbo

0

原因你的錯誤是應該public class Main

而且您的代碼就會TLE,則必須觀察蠻力將永遠不會在SPOJ工作。解決這個問題的方法是看到一個有趣的模式,權力爲5,最後爲零。

+0

哦!我感到困惑和興奮,我的代碼的哪一部分要改變。非常感謝你的答覆。你能否幫我解決這些問題? – kunaguvarun

+0

蠻力=不好。讓我給你一點提示。乘以什麼數字加1零?那麼,n!包含儘可能多的零(在最後),因爲在n中有這些數字的因素。 –

+0

現在我得到一個運行時錯誤NZEC。我已將類名更改爲Main。至於你的方法,我會得到一個零,如果我乘以一個數字10.例如,如果'100!'的值是'93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000'並且有24個零。請解釋我的方法 – kunaguvarun

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; 
} 
+0

我看到你一直在使用java的BigInteger類。您無需爲此問題計算因子。這是一個效率低下的解決方案。查看教程http://en.wikipedia.org/wiki/Trailing_zeros#Factorial 和我在C中的實現以供參考。 我希望你能夠在Java中編寫它。 – 2011-11-03 04:03:28