Мне нужно вычислить среднее значение n чисел. N неизвестен во время компиляции. Каждое из чисел может быть типа int64_t, но я знаю, что среднее также подходит для типа int64_t. Проблема в том, что сумма n чисел может быть слишком большой для int64_t. Какие-либо предложения?
@TarickWelling: В стандарте такого типа нет, и даже если бы он был, он на самом деле не ответил бы на вопрос (который, я признаю, вероятно, должен был быть сформулирован в терминах intmax_t). Теперь, если бы вы превратили эту ссылку в ответ, это был бы полезен...
вы не указали свою платформу или компилятор, поэтому: GCC и CLANG поддерживают нестандартный вариант 128-битного int. Но я думаю, что предпочел бы поэтапный подход
gcc также имеет __builtin_add_overflow, который сообщит вам, если произойдет переполнение, что также может помочь





Среднее значение двух номеров без переполнения
Average = (a / 2) + (b / 2) + (((a % 2) + (b % 2)) / 2)
Это можно распространить и на n чисел.
Предположим, у вас есть n чисел из N1, N2....Nn-1, Nn
Average = (N1 / n) + (N2 / n) +.....+ (Nn-1 / n) + (Nn / n)
+
((N1 % n) + (N2 % n) +.....+ (Nn-1 % n) + (Nn % n)) / n
отлично сделано, я как раз собирался предложить более сложный подход, основанный на той же идее
Интересное решение. Однако это требует, чтобы вы знали n до подачи номера первый, но если вы это сделаете, это сработает хорошо.
есть ли способ сослаться на этот ответ на вопрос, предложенный другими в комментариях к ОП? Я чувствую, что это гораздо лучший ответ, чем тот, который там указан
Осторожно, если n большое, может возникнуть угловой случай, когда ((N1 % n) + (N2 % n) +.....+ (Nn-1 % n) + (Nn % n)) переполняется.
@NO_NAME N для этого должно быть> 2 ^ 32, я думаю, что это подходит для большинства случаев, если кому-то нужно, я думаю, что могу придумать алгоритм, который может поддерживать теоретически бесконечное N (неизвестно заранее)
использовать int128_t?