Задача: В массиве [latex]Z(2n)[/latex] каждый элемент с чётным индексом поменять местами с предыдущим, то есть получить последовательность чисел [latex]z_{2}[/latex], [latex]z_{1}[/latex], [latex]z_{4}[/latex], [latex]z_{3}[/latex], \ldots ,[latex]z_{2n}[/latex], [latex]z_{2n-1}[/latex].
Тесты:
[latex]n[/latex] | Входной массив | Обработанный массив |
5 | 1 2 3 4 5 6 7 8 9 10 | 2 1 4 3 6 5 8 7 10 9 |
7 | 2 4 6 8 10 12 14 16 18 20 22 24 26 28 | 4 2 8 6 12 10 16 14 20 18 24 22 28 26 |
Код на С++:
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 |
#include <iostream> #include <stdio.h> using namespace std; int main () { int n; cin>>n; //задаём размерность массива n*=2; int A[n+1]; //VLA for (int i=1; i<=n; i++) { //присваиваем каждому элементу массива свой порядковый номер (для удобства проверки работы алгоритма) cin>>A[i]; cout<<A[i]<<' '; } for (int i=2; i<=n; i++) { if (i%2==0) { //если номер элемента чётный, int tmp = A[i]; //то меняем местами чётный и нечётный элементы A[i]=A[i-1]; A[i-1] = tmp; } } for (int i=1; i<=n; i++) { //вывод изменённого массива cout<<A[i]<<' '; } return 0; } |
Код на 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 |
import java.util.*; import java.lang.*; import java.io.*; class Nums { public static void numSwap (int[] A, int a, int b) { int tmp = A[a]; A[a] = A[b]; A[b]= tmp; } public static void main (String[] args) { Scanner sc = new Scanner (System.in); int n; n = sc.nextInt(); int[] A; A = new int [2*n]; for (int i=0; i<2*n; i++) A[i] = sc.nextInt(); for (int i=1; i<2*n; i+=2){ numSwap (A, i-1, i); } for (int i=0; i<2*n; i++) System.out.print (A[i] + " "); System.out.print ("\n"); } } |
Решение: Для того, чтобы поменять местами чётный и нечётный по порядковому номеру элементы массива, надо определить чётность порядкового номера. Для этого надо проверить остаток от деления на 2, т.е если [latex]imod2=0[/latex], то меняем предыдущий элемент с текущим.
Для проверки правильности работы программы, воспользуйтесь ссылкой.
Вроде, в условии написано, что размер массива 2n, а Вы n выделяете.
Вот это:
for (int i=1; i<=n; i++) {
if (i%2==0)
вполне можно заменить на вот это:
for (int i=2 i<=n; i+=2) {
Зачем проходиться по заведомо ненужным элементам?
Спасибо большое за помощь и совет, всё исправил.
Забавно. Теперь размер массива в 2 раза больше, но чиаем мы по-прежнему n элементов.
Я бы после считывания n, просто умножал его на 2.
И не забывайте — если Вы хотите нумеровать элементы с 1, а не с 0, Вам придется выделять массив с запасом +1.
— Вместо этого A[i]=i; лучше прочесть массив из входного потока.
— Ввести и обработать нужно именно 2n элементов, а не n как сейчас.
А тесты где?
Принято.
Замечание методического свойства. В С++ массивы начинаются с нуля. Если Вам нужно с 1, то можно просто не использовать нулевой элемент, как Вы и сделали. Это правильно. Но что делать если понадобится массив из 10 элементов, начиная с миллиарда? При таком подходе впустую будет израсходована масса памяти. Может есть смысл делать пересчёт индексов?
Хорошо, что сделали нумерацию с нуля — т.е. используете все элементы массива, не пропуская нулевой. Но зачем тогда размер массива, равный n+1? Теперь лишний элемент в массиве не нужен.
А зачем условие A[i] % 2 == 0? Где в условии задачи сказано про четность элементов?