2016-11-30 4 views
-2

Я пытаюсь решить проблему с сайтом 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; 
} 
+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 ;}. Это должно работать, если мой код правильный; Я не уверен, будет ли это намного быстрее, но это определенно стоит попробовать.

EDIT: Или, как и @ user64322, вы можете сделать то же, что и выше, но вместо того, чтобы умножать на -1, просто возьмите абсолютное значение, которое будет таким же, но быстрее.

+1

Готов поспорить, что это полностью омрачено флешем, который делает 'endl'. –

2

Настоящий удар производительности, если много раз приходилось запускать из «endl», потому что, добавив в конце «\ n», он также очищает поток. Любая другая микрооптимация в лучшем случае совершенно бессмысленна, я уверен, что компилятор достаточно умен, чтобы разместить достаточно быстрый код на своем месте.

EDIT: Также можно добавить 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; 
}