2017-05-09 9 views
0

私のソリューションをコーデックフに提出すると、タイムリミットエラーが続きます。私はスキャナーからバッファードリーダーに切り替えましたが、それで修正されませんでした。私はそれが私のアルゴリズムにあると思っていますが、それぞれの5桁の減分をチェックする以外に、どこが不必要なのか分かりません。私はそれを解決する方法を見つけることができるように、私はどこに位置している問題はどこですか?ここでコーデックフのTLEを取得する理由がわかりません

は参照用のリンクです:ここでhttps://www.codechef.com/problems/FCTRL

は私のコードです:

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.io.IOException; 

class Factorial { 
    public static void main(String[] args) throws IOException { 
     BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); 

     //how many numbers follow 
     int number = Integer.parseInt(keyboard.readLine()); 
     //stores zSum's to output later 
     int[] answerArray = new int[number]; 

     for(int i = 0; i < number; i++) { 
      //the number to compute factorial 
      int n = Integer.parseInt(keyboard.readLine()); 

      // moves number to one ending in 5 
      n -= n % 5; 
      //stores number of zeros 
      int zSum = 0; 

      for (int j = n; j > 0; j -= 5) { 

       //if a power of 5, add 1 to zSum 
       for (int k = 5; k <= j; k *= 5) { 
        if (j % k == 0) { 
         zSum ++; 
        } 
       } 
      } 
      answerArray[i] = zSum; 
     } 

     //println all values in array 
     for (int i = 0; i < number; i++) { 
      System.out.println(answerArray[i]); 
     } 
    } 
} 
+0

ループで 'System.out.println'を実行するのではなく、' StringBuilder'を使ってみましたか?コードが何度も標準出力をフラッシュしているため、パフォーマンスが大幅に低下する可能性があります。 –

答えて

1

あなたの複雑さは、ハイに

(int型J = nのためであり、j> 0; jの - = 5)

はO(N)操作を行います。内部サイクルはログを複雑にするでしょう。 あなたは別のアプローチを使用して記述する必要があります。テストケースごとにO(log(N))時間を使用して実行できます。

+0

私は複雑さを減らすべきですか?私はショートカットをとるとランタイムが短くなると思った。 "O(log(N))"を説明してください –

+0

1からNまでのすべての数を分解するには5の数を知る必要があります.N/5の数は少なくとも1つを5にします。 N/25 - 少なくとも2、N/5^k - 少なくともk。したがって、5^i <= Nのすべてのiについて(N/5^i)の合計を計算します。 –

関連する問題