2016-11-30 186 views
-2

我试图从网站open.kattis.com https://open.kattis.com/problems/different更高效的CPP代码

问题是你在两个非负整数采取从0到10^15解决了问题,你计算差值。我写了这个,它计算正确,但它不够快,我怎么能使它更快?

#include <iostream> 
#include <stdio.h> 

using namespace std; 

int main() { 
    long long int a, b; 
    while(a != 0){ 
     cin >> a >> b; 
     if (a > b) { cout << a-b << endl;} 
     else{ cout << b-a << endl;} 
    } 
    return 0; 
} 
+5

'a'未初始化。 –

+0

而不是检查条件,使用可以使用“abs(a-b)” – Sniper

+1

摆脱'endl'可能会有所帮助。改用'“\ n”'替代。 –

回答

0

而不是做一个比较,看看哪个是更大的,这需要更多的时间,你可以忘掉这是更大的,反正计算差值:cout << a-b << ends;如果b大于a则是你最终会结果是负面的。在这种情况下,乘以-1。我主要用C语言工作,但我认为在C++中,它看起来像这样:首先将计算结果存储在变量'x'long long int x = a-b,然后if (x < 0) { x *= -1 ;}。这应该工作,如果我的代码是正确的;我不确定它会更快,但绝对值得一试。

编辑:或者像@ user64322说的,你可以像上面那样做,但不是乘以-1,只取绝对值,这是相同的,但更快。

+1

我敢打赌,这完全是因为'endl'的冲洗而黯然失色。 –

2

真正的性能击中,如果跑了很多次,实际上会来自'endl',因为尽管它在最后添加了'\ n',但它也会刷新流。任何其他的微型优化在最好的情况下都是毫无意义的,我相信编译器足够聪明,可以在其中放置足够快的代码。

编辑:也可以添加std::ios::sync_with_stdio(false);如果你真的绝望潜在的性能提高。这可以防止C风格流之间的同步。请参阅:sync

0

除了别人的建议,你可以做一个明显的一点就是使用argv采取命令行参数在启动时(例如./PrintDiffQuick 10 5将打印5)而不是阻塞执行,同时等待用户输入。

#include <cinttypes> 
#include <iostream> 

int main(int argc, const char **argv) 
{ 
     std::ios::sync_with_stdio(false); 
     std::cout << std::imaxabs(std::strtoimax(argv[1], nullptr, 10) - 
            std::strtoimax(argv[2], nullptr, 10)) << '\n'; 
     return 0; 
}