#include <stddef.h>
#include <stdio.h>
#include <math.h>
#define countof(array) (sizeof(array) / sizeof((array)[0]))
static void calculate( const double * array, size_t length) {
double sum_of_negatives = 0.0 ;
// Текущие минимум и максимум, такие, чтобы первая же итерация заполнила
// их реальными значениями.
double minimum = + HUGE_VAL;
double maximum = - HUGE_VAL;
// Текущее частичное и предполагаемое решения для ситуации, когда
// минимальный элемент предшествует максимальному: min (...) max.
double minfirst_running = 0.0 , minfirst_solution = 1.0 ;
// Текущее частичное и предполагаемое решения для: max (...) min.
double maxfirst_running = 0.0 , maxfirst_solution = 1.0 ;
for ( size_t i = 0 ; i < length; i++ ) {
double value = array[ i] ;
// Суммируем отрицательные числа.
if ( value < 0.0 ) {
sum_of_negatives += value;
}
// Эти временные переменные нужны, чтобы избежать дополнительных
// условий из-за взаимных зависимостей между двумя условиями ниже.
double minfirst_current = minfirst_running;
double maxfirst_current = maxfirst_running;
minfirst_running *= value;
maxfirst_running *= value;
if ( value > maximum) {
// Если мы нашли новый максимум, запоминаем текущее произведение,
// как решение для min (...) max, а решение для max (...) min
// становится неверным, т.к., считалось с неправильного максимума.
maximum = value;
maxfirst_solution = maxfirst_running = maxfirst_current = 1.0 ;
minfirst_solution = minfirst_current;
}
if ( value < minimum) {
// Нашли новый минимум. Та же хуйня, что и с максимумом, только
// переменные другие.
minimum = value;
minfirst_running = minfirst_solution = 1.0 ;
maxfirst_solution = maxfirst_current;
}
}
// Если между min и max нет элементов, произведение будет равно 1.
double product = ( minfirst_solution != 1.0 ) ?
minfirst_solution : maxfirst_solution;
printf ( "Сумма отрицательных элементов: %g\n " , sum_of_negatives
) ; printf ( "Произведение между мин. и макс. элементами: %g\n " , product
) ; }
int main( void )
{
double array1[ ] = { 6 , 2 , 3 , 4 , 5 , - 1 , - 5 } ;
calculate( array1, countof( array1) ) ;
double array2[ ] = { - 2 , 2 , 3 , 4 , - 1 , 8 , 2 } ;
calculate( array2, countof( array2) ) ;
}
I2luY2x1ZGUgPHN0ZGRlZi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgY291bnRvZihhcnJheSkgKHNpemVvZihhcnJheSkgLyBzaXplb2YoKGFycmF5KVswXSkpCgpzdGF0aWMgdm9pZCBjYWxjdWxhdGUoY29uc3QgZG91YmxlICphcnJheSwgc2l6ZV90IGxlbmd0aCkgewogICAgZG91YmxlIHN1bV9vZl9uZWdhdGl2ZXMgPSAwLjA7CgogICAgLy8g0KLQtdC60YPRidC40LUg0LzQuNC90LjQvNGD0Lwg0Lgg0LzQsNC60YHQuNC80YPQvCwg0YLQsNC60LjQtSwg0YfRgtC+0LHRiyDQv9C10YDQstCw0Y8g0LbQtSDQuNGC0LXRgNCw0YbQuNGPINC30LDQv9C+0LvQvdC40LvQsAogICAgLy8g0LjRhSDRgNC10LDQu9GM0L3Ri9C80Lgg0LfQvdCw0YfQtdC90LjRj9C80LguCiAgICBkb3VibGUgbWluaW11bSA9ICtIVUdFX1ZBTDsKICAgIGRvdWJsZSBtYXhpbXVtID0gLUhVR0VfVkFMOwoKICAgIC8vINCi0LXQutGD0YnQtdC1INGH0LDRgdGC0LjRh9C90L7QtSDQuCDQv9GA0LXQtNC/0L7Qu9Cw0LPQsNC10LzQvtC1INGA0LXRiNC10L3QuNGPINC00LvRjyDRgdC40YLRg9Cw0YbQuNC4LCDQutC+0LPQtNCwCiAgICAvLyDQvNC40L3QuNC80LDQu9GM0L3Ri9C5INGN0LvQtdC80LXQvdGCINC/0YDQtdC00YjQtdGB0YLQstGD0LXRgiDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LzRgzogbWluICguLi4pIG1heC4KICAgIGRvdWJsZSBtaW5maXJzdF9ydW5uaW5nID0gMC4wLCBtaW5maXJzdF9zb2x1dGlvbiA9IDEuMDsKCiAgICAvLyDQotC10LrRg9GJ0LXQtSDRh9Cw0YHRgtC40YfQvdC+0LUg0Lgg0L/RgNC10LTQv9C+0LvQsNCz0LDQtdC80L7QtSDRgNC10YjQtdC90LjRjyDQtNC70Y86IG1heCAoLi4uKSBtaW4uCiAgICBkb3VibGUgbWF4Zmlyc3RfcnVubmluZyA9IDAuMCwgbWF4Zmlyc3Rfc29sdXRpb24gPSAxLjA7CgogICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewogICAgICAgIGRvdWJsZSB2YWx1ZSA9IGFycmF5W2ldOwogICAgICAgIAogICAgICAgIC8vINCh0YPQvNC80LjRgNGD0LXQvCDQvtGC0YDQuNGG0LDRgtC10LvRjNC90YvQtSDRh9C40YHQu9CwLgogICAgICAgIGlmICh2YWx1ZSA8IDAuMCkgewogICAgICAgICAgICBzdW1fb2ZfbmVnYXRpdmVzICs9IHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgLy8g0K3RgtC4INCy0YDQtdC80LXQvdC90YvQtSDQv9C10YDQtdC80LXQvdC90YvQtSDQvdGD0LbQvdGLLCDRh9GC0L7QsdGLINC40LfQsdC10LbQsNGC0Ywg0LTQvtC/0L7Qu9C90LjRgtC10LvRjNC90YvRhQogICAgICAgIC8vINGD0YHQu9C+0LLQuNC5INC40Lct0LfQsCDQstC30LDQuNC80L3Ri9GFINC30LDQstC40YHQuNC80L7RgdGC0LXQuSDQvNC10LbQtNGDINC00LLRg9C80Y8g0YPRgdC70L7QstC40Y/QvNC4INC90LjQttC1LgogICAgICAgIGRvdWJsZSBtaW5maXJzdF9jdXJyZW50ID0gbWluZmlyc3RfcnVubmluZzsKICAgICAgICBkb3VibGUgbWF4Zmlyc3RfY3VycmVudCA9IG1heGZpcnN0X3J1bm5pbmc7CiAgICAgICAgCiAgICAgICAgbWluZmlyc3RfcnVubmluZyAqPSB2YWx1ZTsKICAgICAgICBtYXhmaXJzdF9ydW5uaW5nICo9IHZhbHVlOwoKICAgICAgICBpZiAodmFsdWUgPiBtYXhpbXVtKSB7CiAgICAgICAgICAgIC8vINCV0YHQu9C4INC80Ysg0L3QsNGI0LvQuCDQvdC+0LLRi9C5INC80LDQutGB0LjQvNGD0LwsINC30LDQv9C+0LzQuNC90LDQtdC8INGC0LXQutGD0YnQtdC1INC/0YDQvtC40LfQstC10LTQtdC90LjQtSwKICAgICAgICAgICAgLy8g0LrQsNC6INGA0LXRiNC10L3QuNC1INC00LvRjyBtaW4gKC4uLikgbWF4LCDQsCDRgNC10YjQtdC90LjQtSDQtNC70Y8gbWF4ICguLi4pIG1pbgogICAgICAgICAgICAvLyDRgdGC0LDQvdC+0LLQuNGC0YHRjyDQvdC10LLQtdGA0L3Ri9C8LCDRgi7Qui4sINGB0YfQuNGC0LDQu9C+0YHRjCDRgSDQvdC10L/RgNCw0LLQuNC70YzQvdC+0LPQviDQvNCw0LrRgdC40LzRg9C80LAuCiAgICAgICAgICAgIG1heGltdW0gPSB2YWx1ZTsKICAgICAgICAgICAgbWF4Zmlyc3Rfc29sdXRpb24gPSBtYXhmaXJzdF9ydW5uaW5nID0gbWF4Zmlyc3RfY3VycmVudCA9IDEuMDsKICAgICAgICAgICAgbWluZmlyc3Rfc29sdXRpb24gPSBtaW5maXJzdF9jdXJyZW50OwogICAgICAgIH0KCiAgICAgICAgaWYgKHZhbHVlIDwgbWluaW11bSkgewogICAgICAgICAgICAvLyDQndCw0YjQu9C4INC90L7QstGL0Lkg0LzQuNC90LjQvNGD0LwuINCi0LAg0LbQtSDRhdGD0LnQvdGPLCDRh9GC0L4g0Lgg0YEg0LzQsNC60YHQuNC80YPQvNC+0LwsINGC0L7Qu9GM0LrQvgogICAgICAgICAgICAvLyDQv9C10YDQtdC80LXQvdC90YvQtSDQtNGA0YPQs9C40LUuCiAgICAgICAgICAgIG1pbmltdW0gPSB2YWx1ZTsKICAgICAgICAgICAgbWluZmlyc3RfcnVubmluZyA9IG1pbmZpcnN0X3NvbHV0aW9uID0gMS4wOwogICAgICAgICAgICBtYXhmaXJzdF9zb2x1dGlvbiA9IG1heGZpcnN0X2N1cnJlbnQ7CiAgICAgICAgfQogICAgfQoKICAgIC8vINCV0YHQu9C4INC80LXQttC00YMgbWluINC4IG1heCDQvdC10YIg0Y3Qu9C10LzQtdC90YLQvtCyLCDQv9GA0L7QuNC30LLQtdC00LXQvdC40LUg0LHRg9C00LXRgiDRgNCw0LLQvdC+IDEuCiAgICBkb3VibGUgcHJvZHVjdCA9IChtaW5maXJzdF9zb2x1dGlvbiAhPSAxLjApID8KICAgICAgICBtaW5maXJzdF9zb2x1dGlvbiA6IG1heGZpcnN0X3NvbHV0aW9uOwogICAgCiAgICBwcmludGYoItCh0YPQvNC80LAg0L7RgtGA0LjRhtCw0YLQtdC70YzQvdGL0YUg0Y3Qu9C10LzQtdC90YLQvtCyOiAlZ1xuIiwgc3VtX29mX25lZ2F0aXZlcyk7CiAgICBwcmludGYoItCf0YDQvtC40LfQstC10LTQtdC90LjQtSDQvNC10LbQtNGDINC80LjQvS4g0Lgg0LzQsNC60YEuINGN0LvQtdC80LXQvdGC0LDQvNC4OiAlZ1xuIiwgcHJvZHVjdCk7Cn0KCmludCBtYWluKHZvaWQpCnsKICAgIGRvdWJsZSBhcnJheTFbXSA9IHsgNiwgMiwgMywgNCwgNSwgLTEsIC01IH07CiAgICBjYWxjdWxhdGUoYXJyYXkxLCBjb3VudG9mKGFycmF5MSkpOwogICAgCiAgICBkb3VibGUgYXJyYXkyW10gPSB7IC0yLCAyLCAzLCA0LCAtMSwgOCwgMiB9OwogICAgY2FsY3VsYXRlKGFycmF5MiwgY291bnRvZihhcnJheTIpKTsKfQo=