更高效的cpp代码

时间:2016-11-30 18:53:57

标签: c++ algorithm

我正在尝试从网站open.kattis.com https://open.kattis.com/problems/different

解决问题

问题是你从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;
}

3 个答案:

答案 0 :(得分:2)

真正的性能影响,如果多次运行,实际上会来自'endl',因为虽然它最后添加'\ n',但它也会刷新流。任何其他微优化充其量都是毫无意义的,我确信编译器足够智能,可以在其中放置足够快的代码。

编辑:如果您真的非常渴望潜在的性能提升,也可以添加std::ios::sync_with_stdio(false);。这可以防止C样式流之间的同步。请参阅:sync

答案 1 :(得分:0)

如果cout << a-b << ends;大于{{1>,而不是进然后是的,你最终会得到一个否定的结果。在这种情况下,将它乘以-1。我主要使用C语言,但我认为在C ++中,它看起来像这样:首先将计算结果存储在一个变量&#39; x&#39; b,然后是a。如果我的代码是正确的,这应该有用;我不确定它是否会更快,但绝对值得一试。

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

答案 2 :(得分: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;
}