2013-08-22 174 views
1

我在問題代碼FCCHL的codechef處提供了此解決方案。減少以下代碼中的時間

我看到別人的人使用的C語言一樣(我使用C++ GCC 4.8.1)則稍差, 礦是0.46s,而他們是0.23

有人可以幫助我的編譯時間如果可能的話減少時間?

#include<iostream> 
using namespace std; 
int main() 
{ 
    long int t,i,temp; 
    cin>>t; 
    long int n[t],a[t]; 
    for(i=0;i<t;i++) 
    { 
     temp=1; 
     a[i]=0; 
     cin>>n[i]; 
     while(temp) 
     { 
      temp=n[i]/5; 
      a[i]+=temp; 
      n[i]=n[i]/5; 
     } 
    } 
    for(i=0;i<t;i++) 
    cout<<a[i]<<"\n"; 

    return(0); 
} 
+0

我不熟悉codechef,爲什麼編譯時間很重要? – orlp

+0

這並不重要,但我想知道我是否可以減少執行此程序的時間。 –

+0

而且,如果我使用更多的變量比所需的東西和那樣的東西。 –

回答

1

從你的描述,你正在使用C++和他們使用的是C,但可能是由於編譯器如何處理每一個指令。

你也可以嘗試更換

temp=n[i]/5; 
a[i]+=temp; 
n[i]=n[i]/5; 

通過

temp=n[i]/5; 
a[i]+=temp; 
n[i]=temp; //why compute the value again 

看看是否有一段時間減少或不

+0

有趣的是,我希望編譯器能夠優化這個(通用子表達式消除),但是我不知道是否可能存在潛在的別名問題:如果編譯器無法證明'a [i]'和'n [i]'是不同的,那麼它不能消除子表達式,因此你的優化可能很重要。 –

+0

@MatthieuM。感謝您的輸入。 – Saksham

+0

好吧,它減少到0.43秒。所以,謝謝。 –

0

你最糟糕的進攻到C++使用可變參數長數組,這些都是非標準。

事實上,事實證明,你絕對不需要它們。這個問題可以在每行的基礎上解決,所以使用數組來保存輸入和輸出是沒有用的。

這是您的程序,簡化。我還注意到temp在循環中沒用(儘管它可能被優化了,但它污染了代碼)。

#include <iostream> 

int main() 
{ 
    size_t number = 0; 
    std::cin >> number; 

    for(size_t i = 0 ; i < number; ++i) 
    { 
     size_t a = 0, n = 0; 

     std::cin >> n; 

     while (n) 
     { 
      n /= 5; 
      a += n; 
     } 

     std::cout << a << '\n'; 
    } 
} 

可以做得更好嗎?哦,是的!這裏的主要問題是the C++ streams are none too fast,所以你可以通過切換到C讀取方法來獲得很好的提升...但是它們不是很好(並且安全)。

+0

所以,事實證明,只是使用scanf和printf將時間縮短到了0.2秒。謝謝。 –

+0

@LakshayChhikara:在這裏並不感到意外,IO Streams不遵守C++的精神*你不支付你不需要的*。 –

+0

再次感謝您的幫助。 –