Почему while (scanf (& quot;% lld & quot ;, & amp; num) == 1) быстрее, чем while (scanf (& quot;% lld & quot ;, & amp; num))

Я попытался решить проблему от Uva Online Judge. Номер проблемы 10302. Мой принятый код указан ниже.

 #include <cstdio>

int main()
{
long long int num, sum;

while(scanf("%lld", &num) == 1)  {

//sumOfCube(sum, num);
//sum = (long long int)(num * num * (num + 1) * (num + 1)) / 4;
printf("%lld\n", ((num * num) * ((num + 1) * (num + 1))) / 4);
}

return (0);
}

И вот мой срок превысил код

#include <cstdio>

int main()
{
long long int num, sum;while(scanf("%lld", &num))  {

//sumOfCube(sum, num);
//sum = (long long int)(num * num * (num + 1) * (num + 1)) / 4;
printf("%lld\n", ((num * num) * ((num + 1) * (num + 1))) / 4);
}

return (0);
}

Единственная разница

 while(scanf("%lld", &num) == 1)

А также

 while(scanf("%lld", &num))

Я думаю, что второй быстрее. Потому что первый добавить дополнительный оператор == проверить равенство. Здесь уже с правой стороны true (1) и когда scanf() принимает вход, то левая сторона true, Если обе стороны true тогда while петля это правда. Я думаю, что это лишняя потеря времени.

Но я не могу понять, почему судья выбирает первый быстрее.

Любой, пожалуйста, объясните это.

0

Решение

Ваша вторая версия имеет бесконечный цикл.

scanf возвращается EOF (вероятно, макрос для -1, хотя это зависит в некоторой степени от вашей системы) когда у нее заканчивается ввод, и это возвращаемое значение удовлетворяет вашему очень слабому состоянию.

Ваша логика о том, что второй «быстрее», потому что вы не написали == 1 не имеет смысла (C ++ не выполняется по одному символу исходного кода за раз!), и это хороший пример того, почему вы должны предпочесть понять логику вместо того, чтобы тратить все свое время на попытки микрооптимизации.

В следующий раз добавьте отладочный вывод в ваш код или запустите программу через отладчик. Вы очень быстро увидите, что происходит.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]