#1536: 求救!有請路過高手解決不明TLE!


timmymike (超小小蝦米)

學校 : 中原大學
編號 : 2130
來源 : [61.219.23.150]
最後登入時間 :
2023-01-30 16:17:23
d122. Oh! My Zero!! -- liouzhou_101 | From: [219.80.34.154] | 發表日期 : 2009-03-11 15:21

# include <iostream>

using namespace std ;

int main() {

  long int num = 0 ; // 要算階乘的數字
  long int total = 0 ; // 總共的0數
  int j = 1 ;
  while ( cin >> num ) {

    total = num / 5 ; // 遇到2*5 = 10 多一個0 遇到10也會多一個0 
    // 所以0的數目等於每遇到5就多一個


    for ( int i = 25 ; i <= num ; i *= 5 ) {
    // 考慮25*4=100 125*8=1000的特殊狀況
      total += j ;
      j ++ ; // 100是多1個0,125*8=1000時是多2個0,依此類推....
    } // for

    cout << total << endl ;


  } // while

  return 0 ;

} // main()

/*

  為什麼會TLE??這是我完全預料不到的結果,請問有人看得出是哪裡出問題嗎?
  感謝過目的人的大恩大德!

*/

 
#1587: Re:求救!有請路過高手解決不明TLE!


bleed1979 (Bleed)

學校 : 不指定學校
編號 : 1489
來源 : [203.204.21.29]
最後登入時間 :
2021-05-02 22:12:13
d122. Oh! My Zero!! -- liouzhou_101 | From: [118.168.128.180] | 發表日期 : 2009-03-19 16:54

# include

using namespace std ;

int main() {

  long int num = 0 ; // 要算階乘的數字
  long int total = 0 ; // 總共的0數
  int j = 1 ;
  while ( cin >> num ) {

    total = num / 5 ; // 遇到2*5 = 10 多一個0 遇到10也會多一個0 
    // 所以0的數目等於每遇到5就多一個


    for ( int i = 25 ; i <= num ; i *= 5 ) {
    // 考慮25*4=100 125*8=1000的特殊狀況
      total += j ;
      j ++ ; // 100是多1個0,125*8=1000時是多2個0,依此類推....
    } // for

    cout << total << endl ;


  } // while

  return 0 ;

} // main()

/*

  為什麼會TLE??這是我完全預料不到的結果,請問有人看得出是哪裡出問題嗎?
  感謝過目的人的大恩大德!

*/

75! 只看數字不也是25 * 3

所以計算25的部份要怎麼的...

計算125的部份又要怎麼的...

 

 
#1596: Re:求救!有請路過高手解決不明TLE!


timmymike (超小小蝦米)

學校 : 中原大學
編號 : 2130
來源 : [61.219.23.150]
最後登入時間 :
2023-01-30 16:17:23
d122. Oh! My Zero!! -- liouzhou_101 | From: [219.80.34.154] | 發表日期 : 2009-03-21 13:43

/*

這是依照真正算出的結果,依規律寫出來的程式碼,我知道上次的是錯的了...

但還是TLE...orz
有人看的出是哪裡造成TLE嗎?
求教...感激不盡...
*/

# include <iostream>

using namespace std ;

int main() {

  long int num = 0 ; // 要算階乘的數字
  long int total = 0 ; // 總共的0數
  bool first = true ;


  while ( cin >> num ) {
    first = true ;
    total = num / 5 ; // 遇到2*5 = 10 多一個0 遇到10也會多一個0
    // 所以0的數目等於每遇到5就多一個


    for ( int cycle5 = 25 ; cycle5 <= num ; cycle5 *= 5 ) {
    // 根據實際算出結果後觀察所得的規律,需要再加這個for
      if ( ! first ) //  對於第一次的25,沒有要再加1
        total ++ ;
      for( int i = cycle5 ; i <= num ; i += cycle5 )
        total ++ ;

    } // for

    cout << total << endl ;


  } // while

  return 0 ;

} // main()

 
#1598: Re:求救!有請路過高手解決不明TLE!


sagit (sagit)

學校 : 國立臺中女子高級中學
編號 : 1457
來源 : [211.23.3.219]
最後登入時間 :
2024-06-13 10:01:48
d122. Oh! My Zero!! -- liouzhou_101 | From: [203.67.210.204] | 發表日期 : 2009-03-21 15:25

/*

這是依照真正算出的結果,依規律寫出來的程式碼,我知道上次的是錯的了...

但還是TLE...orz
有人看的出是哪裡造成TLE嗎?
求教...感激不盡...
*/

# include

using namespace std ;

int main() {

  long int num = 0 ; // 要算階乘的數字
  long int total = 0 ; // 總共的0數
  bool first = true ;


  while ( cin >> num ) {
    first = true ;
    total = num / 5 ; // 遇到2*5 = 10 多一個0 遇到10也會多一個0
    // 所以0的數目等於每遇到5就多一個


    for ( int cycle5 = 25 ; cycle5 <= num ; cycle5 *= 5 ) {
    // 根據實際算出結果後觀察所得的規律,需要再加這個for
      if ( ! first ) //  對於第一次的25,沒有要再加1
        total ++ ;
      for( int i = cycle5 ; i <= num ; i += cycle5 )
        total ++ ;

    } // for

    cout << total << endl ;


  } // while

  return 0 ;

} // main()


你要做的事, 就是去尋找總共有 5 的幾次方,

當然你可以對每個數都去除以 5 , 直到它不能被整除為止,

只不過這樣的方法是很慢的....

 

快一點的方法是, 我們只挑 5 的倍數來做,

只不過以這題的測資來說, 這樣還是會 TLE ....

 

更快一點的做法, 是直接計算有幾個 5 的倍數,

再加上有幾個是 5*5 也就是 25 的倍數,

因為 5 的倍數也包括 25 的倍數, 但是它們有兩次的 5 , 所以要加兩次....

接下來再計算 5*5*5=125 , 也就是 5^3, 還有 5^4、5^5、 .... 等等,

直到比輸入的數大為止, 把這些數的倍數個數加起來, 就是答案了....

因為都是用計算的, 也就是只有除一除就可以算出來,

所以最多只要除 log5(N) 次就可以算出這些數,

這樣就快得多了, 也不會 TLE ....

 
#1622: Re:求救!有請路過高手解決不明TLE!


timmymike (超小小蝦米)

學校 : 中原大學
編號 : 2130
來源 : [61.219.23.150]
最後登入時間 :
2023-01-30 16:17:23
d122. Oh! My Zero!! -- liouzhou_101 | From: [218.166.77.17] | 發表日期 : 2009-03-26 21:22

聽不是很懂這位前輩的指示耶??

 我按照您的意思去寫程式碼,似乎並不是正解,也沒有按照您的意思去做,可否再解是一次呢?

 抱歉,麻煩了!謝謝!

# include <iostream>
# include <math.h>

using namespace std ;

int main() {

  long int num = 0 ; // 要算階乘的數字
  long int total = 0 ; // 總共的0數
  double lognum = 0 ;
  bool first = true ;


  while ( cin >> num ) {
    first = true ;
    total = num / 5 ; // 遇到2*5 = 10 多一個0 遇到10也會多一個0
    // 所以0的數目等於每遇到5就多一個
    lognum = log( (long int)num ) / log( (long int)5 ) ;
    total += (long int)lognum ;


    cout << total << endl ;


  } // while

  return 0 ;

} // main()

 
ZeroJudge Forum