Array26. Дан целочисленный массив размера $$N$$. Проверить, чередуются ли в нем четные и нечетные числа. Если чередуются, то вывести $$0$$, если нет, то вывести порядковый номер первого элемента, нарушающего закономерность.
Решение:
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 |
program Array26; var a:array[1..10] of integer; N,i,temp:Integer; begin Write('N: '); Readln(N); for i:=1 to N do begin write(i,' :'); readln(a[i]); end; Temp:=abs(a[1] mod 2); i:=2; while (i<=N) and (temp <> abs(a[i] mod 2)) do begin temp:= abs(a[i] mod 2); inc(i); end; if i=N+1 then Writeln('0') else Writeln(i); end. |
Решение от olegst1975:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
var i,n,d:integer; a:array [1..10]of integer; begin read(n); for i:=1 to n do begin read(a[i]); if i=1 then d:=0 else if (odd(a[i]))xor(odd(a[i-1])) then continue else if d=0 then d:=i; end; write(d); end. |
Решение Newton:
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 30 |
program Array26; var Vector:array[1..10] of integer; NumOfElements,Index:Integer; OddMix:boolean; begin Write('N: '); Readln(NumOfElements); for Index:=1 to NumOfElements do begin write(Index,' :'); readln(Vector[Index]); end; OddMix := True; Index := 1; while OddMix and (Index < NumOfElements) do begin OddMix := (odd(Vector[Index]) = (not odd(Vector[Index + 1]))); inc(Index); end; write('The element number that breaks the sequence is: '); if OddMix then writeln(0) else writeln(Index); end. |
Решение от Kirk и Anton:
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 |
Program a26; Var a: array [1..10] of integer; n,i,d: integer; Begin Write('N='); Readln(n); For i:=1 to n do Begin Write(i,': '); Readln(a[i]); End; d:=0; Writeln; For i:=2 to n do Begin If odd(a[i-1]) = odd(a[i]) then begin d:=i; break; end; End; Writeln(d); End. |
Другие задачи из раздела Array можно посмотреть здесь.
Исходные данные
N = 5
3 -5 -3 -4 2
Полученные результаты
3
Пример верного решения
2
мда.. опять связался с for и понадеялся на его счётчик… в delphi 7 выводится результат 2 (вроде как всё хорошо). Но получается не стабильно в зависимости от компилятора переписал решение на while:
Было:
Стало:
Скорее здесь еще один нюанс — знак остатка при его взятии у отрицательного числа. Здесь, наверное, a[-5] mod 2=-1. Поэтому (a[3] mod 2) не равно (a[-5] mod 2).
поправил, понапихал везде модулей…
Показалось, что проще проверять числа уже при их вводе(+экономим милисекунды), но можно сделать и отдельным циклом
[/crayon]
Здесь есть момент, по условию массив у нас уже есть. То-есть не имеет значение как мы его получаем.
А вот процедура continue мне кажется обсолютно не к месту… вроде никто и не собирается останавливать for так что можно так:
или так:
Но мне всё равно xor понравился… пока добавил как есть..
Я вот так сделал для заданного массива Vector[1..NumOfElements]:
(правда, не уверен, что выражение FALSE=FALSE будет TRUE во всех языках программирования или компиляторах)
Да, хорошее решение. И False всегда равно False. Это логика и соответственно если компилятор хочет выжить, то он всегда это должен правильно обрабатывать. 🙂
проблемы начинаются с неопределёнными выражениями. Обычно они называются NULL. И вот NULL не равен NULL, обычно! Лучше использовать специальные функции проверки на NULL.
А ещё по решению, можно убрать пемеременную OddMix. Но получается грамоздко…
Добавил ваше решение в шапку.
Вот эти два условия:
можно заменить на
И ещё d не определено до условия… это плохо… далеко не во всех компиляторах это будет работать.
Оочень понравилась идея… в общем чуть чуть подкорректировал 🙂 надеюсь вы не против совместного авторства в шапке 🙂