Я только что передал эту функцию в задании. Это сделано (следовательно, нет домашней метки). Но я хотел бы посмотреть, как это можно улучшить.
По сути, функция суммирует квадраты всех целых чисел от 1 до заданного числа, используя следующую формулу:
n(n+1)(2n+1)/6
Где n
- максимальное число.
Приведенная ниже функция предназначена для улавливания любого переполнения и возврата 0 в случае возникновения.
UInt32 sumSquares(const UInt32 number)
{
int result = 0;
__asm
{
mov eax, number //move number in eax
mov edx, 2 //move 2 in edx
mul edx //multiply (2n)
jo end //jump to end if overflow
add eax, 1 //addition (2n+1)
jo end //jump to end if overflow
mov ecx, eax //move (2n+1) in ecx
mov ebx, number //move number in ebx
add ebx, 1 //addition (n+1)
jo end //jump to end if overflow
mov eax, number //move number in eax for multiplication
mul ebx //multiply n(n+1)
jo end //jump to end if overflow
mul ecx //multiply n(n+1)(2n+1)
jo end //jump to end if overflow
mov ebx, 6 //move 6 in ebx
div ebx //divide by 6, the result will be in eax
mov result, eax //move eax in result
end:
}
return result;
}
По сути, я хочу знать, что я могу улучшить там. С точки зрения лучших практик в основном. Одна вещь звучит очевидным: более разумная проверка переполнения (с единственной проверкой того, какой максимальный вход вызовет переполнение).