更高效的 CPP 代码

more efficient cpp code

本文关键字:代码 CPP 高效      更新时间:2023-10-16

我正在尝试从站点 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;
}

如果运行多次,真正的性能影响实际上来自"endl",因为虽然它在末尾添加了"",但它也会刷新流。任何其他微优化充其量都是毫无意义的,我相信编译器足够聪明,可以将足够快的代码放在它的位置。

编辑:如果您真的迫切需要潜在的性能提升,也可以增加std::ios::sync_with_stdio(false);。这会阻止 C 样式流之间的同步。请参阅:同步

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

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

除了其他人的建议之外,您可以做的一件显而易见的事情是在启动时使用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;
}