# 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??這是我完全預料不到的結果,請問有人看得出是哪裡出問題嗎?
感謝過目的人的大恩大德!
*/
# 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的部份又要怎麼的...
/*
這是依照真正算出的結果,依規律寫出來的程式碼,我知道上次的是錯的了...
但還是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()
/*
這是依照真正算出的結果,依規律寫出來的程式碼,我知道上次的是錯的了...
但還是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 ....
聽不是很懂這位前輩的指示耶??
我按照您的意思去寫程式碼,似乎並不是正解,也沒有按照您的意思去做,可否再解是一次呢?
抱歉,麻煩了!謝謝!
# 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()