fork download
  1. #include <stddef.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. #define countof(array) (sizeof(array) / sizeof((array)[0]))
  6.  
  7. static void calculate(const double *array, size_t length) {
  8. double sum_of_negatives = 0.0;
  9.  
  10. // Текущие минимум и максимум, такие, чтобы первая же итерация заполнила
  11. // их реальными значениями.
  12. double minimum = +HUGE_VAL;
  13. double maximum = -HUGE_VAL;
  14.  
  15. // Текущее частичное и предполагаемое решения для ситуации, когда
  16. // минимальный элемент предшествует максимальному: min (...) max.
  17. double minfirst_running = 0.0, minfirst_solution = 1.0;
  18.  
  19. // Текущее частичное и предполагаемое решения для: max (...) min.
  20. double maxfirst_running = 0.0, maxfirst_solution = 1.0;
  21.  
  22. for (size_t i = 0; i < length; i++) {
  23. double value = array[i];
  24.  
  25. // Суммируем отрицательные числа.
  26. if (value < 0.0) {
  27. sum_of_negatives += value;
  28. }
  29.  
  30. // Эти временные переменные нужны, чтобы избежать дополнительных
  31. // условий из-за взаимных зависимостей между двумя условиями ниже.
  32. double minfirst_current = minfirst_running;
  33. double maxfirst_current = maxfirst_running;
  34.  
  35. minfirst_running *= value;
  36. maxfirst_running *= value;
  37.  
  38. if (value > maximum) {
  39. // Если мы нашли новый максимум, запоминаем текущее произведение,
  40. // как решение для min (...) max, а решение для max (...) min
  41. // становится неверным, т.к., считалось с неправильного максимума.
  42. maximum = value;
  43. maxfirst_solution = maxfirst_running = maxfirst_current = 1.0;
  44. minfirst_solution = minfirst_current;
  45. }
  46.  
  47. if (value < minimum) {
  48. // Нашли новый минимум. Та же хуйня, что и с максимумом, только
  49. // переменные другие.
  50. minimum = value;
  51. minfirst_running = minfirst_solution = 1.0;
  52. maxfirst_solution = maxfirst_current;
  53. }
  54. }
  55.  
  56. // Если между min и max нет элементов, произведение будет равно 1.
  57. double product = (minfirst_solution != 1.0) ?
  58. minfirst_solution : maxfirst_solution;
  59.  
  60. printf("Сумма отрицательных элементов: %g\n", sum_of_negatives);
  61. printf("Произведение между мин. и макс. элементами: %g\n", product);
  62. }
  63.  
  64. int main(void)
  65. {
  66. double array1[] = { 6, 2, 3, 4, 5, -1, -5 };
  67. calculate(array1, countof(array1));
  68.  
  69. double array2[] = { -2, 2, 3, 4, -1, 8, 2 };
  70. calculate(array2, countof(array2));
  71. }
  72.  
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
Сумма отрицательных элементов: -6
Произведение между мин. и макс. элементами: -120
Сумма отрицательных элементов: -3
Произведение между мин. и макс. элементами: -24