2013-08-22 92 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

再次感谢您的帮助。 –