Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
GGLeq
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 9
#1

Рекурсия. Составьте программу, которая для заданных значений n и m, определит номер оставшегося в кругу человека - C++

10.06.2013, 19:44. Просмотров 492. Ответов 10
Метки нет (Все метки)

Пусть n человек встали в круг и получили номера от 1 до n по часовой стрелке. Затем, начиная с первого, по часовой стрелке отсчитывается m человек. Этот m–й человек выходит из круга, после чего, начиная со следующего, снова
отсчитывается m–й человек. Так продолжается до тех пор, пока не останется один человек. Составьте программу, которая для заданных значений n и m, определит номер оставшегося в кругу человека.

Пожалуйста, решите рекурсивно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2013, 19:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Рекурсия. Составьте программу, которая для заданных значений n и m, определит номер оставшегося в кругу человека (C++):

Рекурсия. Составьте программу, которая для заданного натурального числа n вычисляет значение выражения - C++
Составьте программу, которая для заданного натурального числа n вычисляет значение выражения: 1/1+1/2+1/3+1/4+1/...n-1+1\n

Составить алгоритм и программу, которая определит стоимость обоев для всей стены, если цена одного рулона X - C++
Хозяин хочет оклеить обоями длинную стену в своем доме. Длина этой стены равна А метров, а высота - В метров. Рулон обоев имеет длину 12...

Составьте программу на языке С++ для вычисления значения функции z=f(x,y) при заданных значениях х и у. - C++
Здравствуйте, кому не сложно помогите решить задачи: Язык: C++, Среда разработки: Dev C++. 1. Составьте программу на языке С++ для...

Составьте программу, которая для целого числа k (от 1 до 99) - C++
Помогите PLEASE. Составьте программу, которая для целого числа k (от 1 до 99), введенного вами, напечатает фразу «Мне k лет», при этом в...

Напишите программу, которая определит, могут ли эти числа быть длинами сторон равнобедренного треугольника - C++
Дорогие мои, пожалуйста помогите, у меня не получается задача(( "На входе три числа. Напишите программу, которая определит, могут ли эти...

Написать программу, которая определит, сколькими способами он может попасть в магазин, пройдя ровно K шагов - C++
Магазин (Время: 1 сек. Память: 16 Мб Сложность: 34%) На расстоянии N шагов от магазина стоит человек. Каждую минуту он выбирает,...

10
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
10.06.2013, 20:14 #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
#include <stdio.h>
 
#define N 10
void Sdvig(int *a, int *end)
{
   if (a + 1 < end)
   {
      *a = *(a + 1);
      Sdvig(a + 1, end);
   }
}
 
int F(int *a, int n, int m)
{
   if (n > 1)
   {
      Sdvig(a + (m - 1) % n, a + n);
      F(a, n - 1, m);
   }
   else return *a;
}
 
int main()
{
    int a[N], i, m = 3;
    for(i = 0; i < N; ++i)
       a[i] = i + 1;
    printf("%d\n", F(a, N, m));
    return 0;
}
0
GGLeq
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 9
12.06.2013, 14:06  [ТС] #3
Какие-либо значения я не ставил все ровно при компиляции выдает: 16364
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.06.2013, 14:27 #4
Да, там ошибка закралась, вот:
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
#define N 10
void Sdvig(int *a, int *end)
{
   if (a + 1 < end)
   {
      *a = *(a + 1);
      Sdvig(a + 1, end);
   }
}
 
int F(int *a, int *b, int n, int m)
{
   if (n > 1)
   {
      b = a + (b - a + m - 1) % n;
      Sdvig(b, a + n);
      Print(a, n - 1);
      F(a, b, n - 1, m);
   }
   else return *a;
}
 
int main()
{
    int a[N], i, m = 4;
    for(i = 0; i < N; ++i)
       a[i] = i + 1;
    printf("%d\n", F(a, a, N, m));
    return 0;
}
0
GGLeq
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 9
12.06.2013, 14:36  [ТС] #5
Вы не описали функцию Print
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.06.2013, 14:38 #6
Цитата Сообщение от GGLeq Посмотреть сообщение
Вы не описали функцию Print
это для теста. удалите эту строку.

C
1
2
3
4
5
6
7
8
9
10
int F(int *a, int *b, int n, int m)
{
   if (n > 1)
   {
      b = a + (b - a + m - 1) % n;
      Sdvig(b, a + n);
      F(a, b, n - 1, m);
   }
   else return *a;
}
0
GGLeq
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 9
12.06.2013, 14:44  [ТС] #7
Аналогичный результат: 16384.
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.06.2013, 14:45 #8
покажите программу, которую вы запускаете
0
GGLeq
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 9
12.06.2013, 14:46  [ТС] #9
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 N 10
void Sdvig(int *a, int *end)
{
   if (a + 1 < end)
   {
      *a = *(a + 1);
      Sdvig(a + 1, end);
   }
}
 
int F(int *a, int *b, int n, int m)
{
   if (n > 1)
   {
      b = a + (b - a + m - 1) % n;
      Sdvig(b, a + n);
     
      F(a, b, n - 1, m);
   }
   else return *a;
}
 
int main()
{
    int a[N], i, m = 4;
    for(i = 0; i < N; ++i)
       a[i] = i + 1;
    printf("%d\n", F(a, a, N, m));
    getchar();
    return 0;
}
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
12.06.2013, 15:01 #10
У вас что-то с компилятором, вот результат онлайн компилятора:
http://ideone.com/i630KA

Добавлено через 6 минут
так попробуйте:
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
#define N 10
#include<iostream>
void Sdvig(int *a, int *end)
{
   if (a + 1 < end)
   {
      *a = *(a + 1);
      Sdvig(a + 1, end);
   }
}
 
int F(int *a, int *b, int n, int m)
{
   if (n > 1)
   {
      b = a + (b - a + m - 1) % n;
      Sdvig(b, a + n);
      F(a, b, n - 1, m);
   }
   else return *a;
}
 
int main()
{
    int a[N], i, m = 4;
    for(i = 0; i < N; ++i)
       a[i] = i + 1;
    std::cout << F(a, a, N, m);
    return 0;
}
1
GGLeq
0 / 0 / 0
Регистрация: 30.05.2013
Сообщений: 9
12.06.2013, 15:02  [ТС] #11
Скорее всего да, ибо с моим кодом та же беда была, благодарю за помощь!
0
12.06.2013, 15:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2013, 15:02
Привет! Вот еще темы с ответами:

Составить алгоритм и программу, которая определит сколько досок надо купить, чтобы поставить сплошной забор - C++
В С++ Имеется садовый участок, имеющий форму прямоугольника со сторонами А метров и В метров. Составьте алгоритм и программу, которая...

Составьте программу, которая содержит оператор while, для расчета суммы целых чисел в диапазоне от а до b - C++
Здравствуйте. Сломал голову, перерыл форумы, но ничего дельного не нашел. Будьте добры помочь)

Составить программу для расчёта значений величин, заданных в виде сложных алгебраических формул - C++
Доброго дня, начал учится и тут буквально после программы &quot;Hello world!&quot;. Даже не знаю основы C++ дают такие задание. Помогите пожалуйста...

Задача на выбывание m-го человека по кругу - C++
Нужно сделать задание двумя способами:Массив и векторным Даны натуральные n и m. Предполагается, что n человек встают в круг и получают...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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