Ссылка на оригинальное решение
Задача:
Даны действительные числа $ a_1, a_2, \dots $. Известно, что $ a_1 > 0 $ и что среди $ a_2, a_3, \dots $ есть хотя бы одно отрицательное число. Пусть $ a_1, \dots , a_n $ — члены данной последовательности, предшествующие первому отрицательному члену ( $ n $ заранее неизвестно). Получить:
$ n + a_n $
Тесты:
№ | Последовательность $ a_i $ | $ n + a_n $ |
1 | 3 1 4 1 5 9 2 6 5 3 5 8 9 7 9 3 2 3 8 4 -6 | 24 |
2 | 2.7183 -0.0001 | 3.7183 |
3 | 1.23 2342 12349 12.434 9845 0.00002034 -3 | 6.00002034 |
4 | 1 2 3 4 5 6 7 8 9 10 -11 | 20 |
Решение:
Массив a — это заданная последовательность $ a_i $, n — количество значений, предшествующих первому отрицательному числу, cur_num — текущее число во входном потоке.
Проэмулируем входной поток с помощью переменной cur_pos . Пока значение в массиве на позиции cur_pos не стало отрицательным, запоминаем считанное число в переменной cur_num , увеличиваем счетчик n на единицу и сдвигаем cur_pos на следующий элемент массива, т. е. считываем следующее число из входного потока. Как только во входном потоке появилось отрицательное значение, цикл прерывается, при этом в n записано количество чисел, предшествующих первому отрицательному числу, а в cur_num — последнее считанное неотрицательное число, которое находится на позиции $ n $.
Выводим ответ на задачу: n + cur_num.
Код программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Test { static function main() { var a : Array<Float> = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11]; var n = 0, cur_num : Float = 0, cur_pos = 0; while(true) { if(a[cur_pos] < 0) break; cur_num = a[cur_pos]; n += 1; cur_pos += 1; } trace(n + cur_num); } } |