Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
#1

Очень интересная головоломка.. - C++

15.12.2009, 13:54. Просмотров 769. Ответов 12
Метки нет (Все метки)

Дан массив целых чисел (n=10);

Переставить элементы след образом

a[1],a[10],a[2],a[9],a[3],a[8].....

Целый день думаю, ничего на ум не приходит...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
15.12.2009, 14:04     Очень интересная головоломка.. #2
BOR1K,
C++
1
for (size_t i = 0 ; i < n ; i++) { int temp = a[i] ; a[i] = a[n-1-i] ; a[n-1-i] = temp;}
solar_wind
752 / 743 / 41
Регистрация: 06.07.2009
Сообщений: 2,961
Завершенные тесты: 1
15.12.2009, 14:05     Очень интересная головоломка.. #3
Да тут все просто
Можно сделать что то типа этого:
C
1
2
3
4
5
6
for(i=0;i<n-1;i++)
{
for(j=n-1;j>i;j--) a[j+1]=a[j];
a[i+1]=a[n-i];
i=i+2;
}
Код правда не отлаживал, могут быть ошибки.
Harlequin
41 / 41 / 4
Регистрация: 08.11.2009
Сообщений: 167
15.12.2009, 14:06     Очень интересная головоломка.. #4
C++
1
2
for(int i = 0; i < 10; i++)
    b[i] = (i%2==0) ? a[i/2] : a[9-i/2];
BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
15.12.2009, 14:08  [ТС]     Очень интересная головоломка.. #5
а у мну такой вариант был)

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include "stdafx.h"
#include "conio.h"
 
int _tmain(int argc, _TCHAR* argv[])
{int m[20],n=10;
for(int i=0;i<n;i++)
{printf("#%d=",i);
scanf("%d",&m[i]);}
//решение
for(int j=0;j<10;j++)
{for(int i=20;i>j+1;i--)
{m[i+1]=m[i];
 m[j]=m[20-i];
}}
 
    
for(int i=0;i<19;i++)
{printf("%d",m[i]);}
 
getch();
return 0;
}
Gorev
132 / 129 / 16
Регистрация: 08.12.2009
Сообщений: 547
Записей в блоге: 3
15.12.2009, 14:08     Очень интересная головоломка.. #6
вот
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses crt;
const n=10;
var a:array [1..10] of real;b:integer;
begin
for b:=1 to n do
begin
a[b]:=int(100*random)-50;
writeln(a[b]);
end;
writeln('        ');
for b:=1 to n do
begin
writeln(a[0+1]);writeln(a[10-1]);end;
readln
end.
Harlequin
41 / 41 / 4
Регистрация: 08.11.2009
Сообщений: 167
15.12.2009, 14:13     Очень интересная головоломка.. #7
а теперь все взяли и запустили свои программки, чтоб убедиться что у всех вышла полная лажа

я так понял что массив только один и вспомогательными пользоваться нельзя?
BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
15.12.2009, 14:15  [ТС]     Очень интересная головоломка.. #8
да один, но можно его взять в 2 раза больше.
CyBOSSeR
Эксперт C++
2298 / 1668 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
15.12.2009, 14:22     Очень интересная головоломка.. #9
Цитата Сообщение от Андрейка Посмотреть сообщение
C++
1
for (size_t i = 0 ; i < n ; i++) { int temp = a[i] ; a[i] = a[n-1-i] ; a[n-1-i] = temp;}
Это реверс.
C++
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
31
32
33
#include <iostream>
 
int main()
{
  setlocale(LC_ALL, "Russian");
 
  const int n = 10;
  int arr[n] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
 
  std::cout << "Начальная последовательность" << std::endl;
 
  for(int i = 0; i < n; ++i)
    std::cout << arr[i] << " ";
  
  std::cout << std::endl;
 
  int res[n];
 
  for(int i = 0; i < n; ++i)
    res[i] = i % 2 ?  arr[n - 1 - i / 2] : arr[i / 2];
 
  
  std::cout << "Переставленная последовательность" << std::endl;
 
  for(int i = 0; i < n; ++i)
    std::cout << res[i] << " ";
 
  std::cout << std::endl;
 
  system("pause");
 
  return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от BOR1K Посмотреть сообщение
да один, но можно его взять в 2 раза больше.
А смысл? Памяти от использования одного массива размером 20 уйдет столько же сколько от использования 2 массивов размером 10.
BOR1K
14 / 14 / 4
Регистрация: 19.09.2009
Сообщений: 289
15.12.2009, 14:24  [ТС]     Очень интересная головоломка.. #10
Спасибо. Но все же не могу понять в чем подвох задачи, если ее решать через 1 массив, у меня были предположения правильного решения через 2 массива сразу))
Андрейка
419 / 223 / 27
Регистрация: 25.03.2009
Сообщений: 744
15.12.2009, 14:26     Очень интересная головоломка.. #11
CyBOSSeR, аа да прогнал ) не так условие прочитал)
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
15.12.2009, 16:08     Очень интересная головоломка.. #12
Цитата Сообщение от BOR1K Посмотреть сообщение
да один, но можно его взять в 2 раза больше.
Вот с этого и начинали бы
C
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
31
32
#include <stdio.h>
#define ARR_SIZE 10
 
int main(void){
    int arr[ARR_SIZE * 2] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
    int *h, *t, *o, i;
    
    printf("Original: ");
    for ( h = arr; h < arr + ARR_SIZE; h++ )
        printf("%d ", *h);
    printf("\n");
    
    for ( h = arr, t = arr + ARR_SIZE - 1, o = arr + ARR_SIZE; h < t; h++, t-- ){
        *o++ = *h;
        *o++ = *t;
    }
    if ( h == t ) /*  это, если бы количество элементов было нечётное */
        *o = *h;
    for ( h = arr, t = o = arr + ARR_SIZE; h < t; h++, o++ ){
        i = *h;
        *h = *o;
        *o = i;
    }
    
    printf("Processed: ");
    for ( h = arr; h < arr + ARR_SIZE; h++ )
        printf("%d ", *h);
    printf("\n");
    
    
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.12.2009, 19:20     Очень интересная головоломка..
Еще ссылки по теме:

C++ Очень интересная задача, не все смогут
C++ Головоломка
C++ Головоломка Хитори
Очень интересная задачка на C++ C++
Головоломка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
15.12.2009, 19:20     Очень интересная головоломка.. #13
Предложу и свой неказистый вариант.Даже не ручаюсь,правильная ли там логика,проверьте. Но вроде работает.
C++
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
#include <iostream>
 
  int main ()
  {
     int a[] = {1,2,3,4,5,6,7,8,9,10};
     int max = 9;
     int temp,last = max;
     
     // Необходимо запомнить последний элемент,
     // а затем сдвинуть все элементы вправо,
     // после чего последний элемент вставляется на
     // место самого левого в сдвигаемом ряде.
     // Шаг сдвига равен 2.
     for (int i = 1; i < max; i+=2)
     {
        temp = a[last];
        for (int j = last; j > i; --j)
        {
           a[last] = a[last-1];
           --last;
        }
        a[i] = temp;
        last = max;
     }
     
     for (int i = 0; i <= 9; ++i)
        std::cout << a[i] << ' ';
        
     return 0;
  }
Yandex
Объявления
15.12.2009, 19:20     Очень интересная головоломка..
Ответ Создать тему
Опции темы

Текущее время: 10:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru