减少以下代码中的时间

时间:2013-08-22 02:00:53

标签: c++ performance

我在codechef上为问题代码提供了这个解决方案:FCTRL。

我看到其他人使用相同语言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);
}

2 个答案:

答案 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

看看是否有一些时间减少

答案 1 :(得分:0)

你对C ++的最严重攻击是使用Variadic-Length数组,那些是非标准的。

事实上,事实证明你绝对不需要它们。这个问题可以在每行的基础上解决,因此使用数组来保存输入和输出是没用的。

这是你的程序,简化。我还注意到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读取方法得到很好的推动......但是它们并不那么好(而且安全)。