Задача
Плюсы и минусы. В массиве [latex] Z(m) [/latex] найти число чередований знака, то есть число переходов с минуса на плюс или с плюса на минус. Например в последовательности 0, -2, 0, -10, 2, -1, 0, 0, 3, 2, -3 четыре чередования (как известно нуль не имеет знака).
Код С++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <iostream> using namespace std; int main() { int m; cin >> m; int Z[m]; int count = 0; int sign = 0; for (int i = 0; i < m; i++){ cin >> Z[i]; } int i = 0; for(i = 0; (Z[i] == 0) && (i < m); i++ ); sign = Z[i]; for (int i = 0; i < m; i++) { if (sign * Z[i] < 0) { sign = Z[i]; count ++; } } cout << "count" << " = " << count << " "; return 0; } |
Код С++ на Ideone: http://ideone.com/qEJL9Z
Код Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import java.util.*; import java.lang.*; import java.io.*; class PlusMinus { public static void main (String[] args) throws java.lang.Exception { Scanner read = new Scanner(System.in); int m = read.nextInt(); int Z[] = new int [m]; int count = 0; int sign = 0; for (int i = 0; i < m; i++){ Z[i] = read.nextInt(); } int i = 0; for(i = 0; (Z[i] == 0) && (i < m); i++ ); sign = Z[i]; for (int j = 0; j < m; j++) { if (sign * Z[j] < 0) { sign = Z[j]; count ++; } } System.out.print("Число чередований знака = "+count); } } |
Комментарии
Задаем массив и делаем проверку: находим первый член массива не равный нулю, запоминаем его знак, находим следующий, проверяем если знаки совпадают ищем следующий член массива, в противном случае к сумме прибавляем единицу и запоминаем новый знак .
Тесты
Размер массива (m) | Массив (Z[m]) | Результаты | Комментарии |
11 | 0 -2 0 -10 2 -1 0 0 3 2 -3 | 4 | Пройден |
1 | 1 | 0 | Пройден |
5 | 1 -2 3 -4 5 | 4 | Пройден |
На самом деле, Вам повезло, что тесты пройдены. Данный код является Undefined Behavior и на моем компьютере на первом тесте выдает 4.
Не знаю, принято ли здесь подсказывать, так что оставлю это решение на преподавателей. 🙂
Со своей стороны задам вопрос: а не является ли -1 0 1 сменой знака (с «-» на «+», но длиной 2)? В такой формулировке задача несколько интереснее.
Вам, как ментору, подсказывать можно.
Вы совершенно правы. Надя немного схитрила изменив условие задачи. Автор считал число переходов через ноль.
— Надя, в условии задачи указано «четыре чередования», а не три. Исправьте, пожалуйста.
— Сделайте сдвиги в операторах внутри условного.
— Расставьте скобки в строке 16.
Зачтено, но:
— Поправьте, пожалуйста, отступы.
— Добавьте в метки «чередование знака», «числовая последовательность»
— Цикл в строке 17 ищет первый ненулевой элемент? Напишите комментарий в программе.
— Цикл в строке 20 должен начинаться не с 0, а с того места на котором остановился предыдущий цикл. Зачем повторно проверять?