MiddleДебаггингИногдаЕщё не отвечали
Почему этот цикл суммы квадратов может быть неопределённым?
a[i] бывает до ~50000, а sum имеет тип int; при больших n итог неверен.
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += a[i] * a[i]; // a[i] до ~50000
}
Найдите и исправьте ошибку.
Арифметика int переполняется на больших квадратах, а знаковое переполнение — это неопределённое поведение (а не перенос), поэтому и a[i] * a[i], и накапливаемый int sum могут молча переполниться. Решение: более широкий тип — long long sum и static_cast<long long>(a[i]) * a[i].
- ✗Считать, что знаковое переполнение переносится как беззнаковое, а не является UB
- ✗Полагать, что умножение автоматически повышается до double
- ✗Винить индекс цикла вместо ширины накопителя
- →Почему знаковое целочисленное переполнение — это UB, а беззнаковое переносится?
- →Почему
a[i]нужно приводить кlong longдо умножения, а не после?