Я попытался решить проблему от 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
петля это правда. Я думаю, что это лишняя потеря времени.
Но я не могу понять, почему судья выбирает первый быстрее.
Любой, пожалуйста, объясните это.
Ваша вторая версия имеет бесконечный цикл.
scanf
возвращается EOF
(вероятно, макрос для -1
, хотя это зависит в некоторой степени от вашей системы) когда у нее заканчивается ввод, и это возвращаемое значение удовлетворяет вашему очень слабому состоянию.
Ваша логика о том, что второй «быстрее», потому что вы не написали == 1
не имеет смысла (C ++ не выполняется по одному символу исходного кода за раз!), и это хороший пример того, почему вы должны предпочесть понять логику вместо того, чтобы тратить все свое время на попытки микрооптимизации.
В следующий раз добавьте отладочный вывод в ваш код или запустите программу через отладчик. Вы очень быстро увидите, что происходит.
Других решений пока нет …