Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 05.01.2011
Сообщений: 25

динамическое программирование и длинная рафиметика(не получается прикрутить длинную арифметику).

05.01.2011, 16:56. Показов 3914. Ответов 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
#include <stdio.h>
 
int rekursia(int K,int N);
 
int main()  {
    int K,N;
    long n;
    /*(freopen("input.txt","r",stdin); /*перенаправление потоков для  
    freopen("output.txt","w",stdout);*/ /*работы с файлами
    scanf("%d %d",&K,&N);
    n=rekursia(K,N);
    printf("%d\n",n);
    
 
 
}
 
int rekursia(int K,int N)  { /* собственно сама функция
    if (N<0) 
        return 0;
    if(N==0)
        return 1;
    if(N==1) 
        return 1;
    return 2*rekursia(K,N-1)-rekursia(K,N-K-1);
}

Текст задачи:

В нашем зоопарке появился заяц. Его поместили в клетку, и чтобы ему не было скучно, директор зоопарка распорядился поставить в его клетке лесенку. Теперь наш зайчик может прыгать по лесенке вверх, перепрыгивая через ступеньки. Лестница имеет определенное количество ступенек N. Заяц может одним прыжком преодолеть не более К ступенек. Для разнообразия зайчик пытается каждый раз найти новый путь к вершине лестницы. Директору любопытно, сколько различных способов есть у зайца добраться до вершины лестницы при заданных значениях K и N. Помогите директору написать программу, которая поможет вычислить это количество. Например, если K=3 и N=4, то существуют следующие маршруты: 1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2, 1+3, 3+1. Т.е. при данных значениях у зайца всего 7 различных маршрутов добраться до вершины лестницы.

Входные данные

В единственной строке входного файла INPUT.TXT записаны два натуральных числа K и N (1 ≤ K ≤ N ≤ 300). К - максимальное количество ступенек, которое может преодолеть заяц одним прыжком, N – общее число ступенек лестницы.

Собственно сама алгоритм: F(K,N)=2*F(K,N-1)-F(K,N-K-1).

Помогите, пожалуйста, с длинной арифметикой, желательно, чтобы использовался целочисленный массив.(потому как при больших K и N ответ не влазит ни в какой тип данных).

Премного благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.01.2011, 16:56
Ответы с готовыми решениями:

Динамическое программирование: самая длинная строго возрастающая подпоследовательность
Здравствуйте!!! У меня есть такое задание: дана последовательность целых чисел. Необходимо найти её самую длинную строго возрастающую...

на длинную арифметику.
Составить программу для вычисления 100!

на длинную арифметику.
Вычислить 7^123. результат должен поместится на экране

9
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
05.01.2011, 17:53
Код прошел все тесты:
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
 
void rekursia(int y, int K,int N, int **mas);
 
int main()  {
        int K,N, **mas, i, j;
        freopen("input.txt","r",stdin); 
        freopen("output.txt","w",stdout);
        scanf("%d %d",&K,&N);
        mas=new int*[N+1];
        for(i=0; i<N+1; i++)
        {
            mas[i]=new int[100];
            for(j=0; j<100; j++)
                mas[i][j]=0;
        }       
        mas[0][0]=1;
        rekursia(1, K, N, mas);
        int fl=1;
        for(i=99; i>=0; i--)
        {
            if(!fl)
                printf("%d", mas[N][i]);
            if(fl && mas[N][i])
            {
                fl=0;
                printf("%d", mas[N][i]);
            }
        }
        return 0; 
}
 
void rekursia(int y, int K,int N, int **mas)  {
    if(y==N+1)
        return;
    int i=0;
    if(y-K>=0)
        i=y-K;
    for(; i<y; i++)
        for(int j=0; j<100; j++)
            mas[y][j]+=mas[i][j];
    for(i=0; i<99; i++)
        if(mas[y][i]>9)
        {
            mas[y][i+1]+=mas[y][i]/10;
            mas[y][i]%=10;
        }
    rekursia(y+1, K, N, mas);
}
1
1 / 1 / 0
Регистрация: 05.01.2011
Сообщений: 25
05.01.2011, 18:08  [ТС]
Спасибо большое, будем разбираться.

Добавлено через 3 минуты
Если кто способен написать попроще, и есть время, не стесняйтесьИнтересны все версии))

Странно, вроде компилится, но когда загружается приложение .exe, выходит ошибка: Debug error!
Извините, если что, я еще совсем новичок.
Это похоже что-то с Visual Studio, код компилится, спасибо ещё
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
05.01.2011, 18:14
trebor, Вы куда сдаете задачу?
0
1 / 1 / 0
Регистрация: 05.01.2011
Сообщений: 25
05.01.2011, 18:22  [ТС]
на acmp.ru.
просто в visual studio тормоза какие-то..
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
05.01.2011, 18:32
Сдать задачу получилось вроде?

Добавлено через 3 минуты
trebor, Напишите любой код который у вас без ошибок работает.
0
1 / 1 / 0
Регистрация: 05.01.2011
Сообщений: 25
05.01.2011, 18:35  [ТС]
Да, получилось, только мне еще интересно было бы разобрать код, а так как я новичок...

Насчёт второго пункта, не совсем понял, но тот код, который в начале топика, работает на малых числах, порядка 30*30.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
05.01.2011, 18:42
trebor, Сейчас я напишу комментарии для своего кода.
Насчет второго пункта (
Странно, вроде компилится, но когда загружается приложение .exe, выходит ошибка: Debug error!
): скорее всего у Вас в проекте не было файла input.txt или он был но не с подходящими данными.
1
1 / 1 / 0
Регистрация: 05.01.2011
Сообщений: 25
05.01.2011, 18:47  [ТС]
ну конечно же, да...., мне стыдно((спасибо, файлы файлы с данными...
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
05.01.2011, 18:55
Я немного не так сделал, не по этому алгоритму:
Цитата Сообщение от trebor Посмотреть сообщение
F(K,N)=2*F(K,N-1)-F(K,N-K-1).
я сделал так:
F(K,N)=F(K, N-1)+F(K, N-2)+...+F(K, N-K).

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
 
void rekursia(int y, int K,int N, int **mas);// в функцию передаем номер текущей ступени y, K, N, двумерный массив для хранения значений F(K,N)
 
int main()  {
        int K,N, **mas, i, j;
        freopen("input.txt","r",stdin); 
        freopen("output.txt","w",stdout);
        scanf("%d %d",&K,&N);
                mas=new int*[N+1];// создаем двумерный массив размером (N+1)*100 - каждая строка это значение F(K,N), сто элементов типа int в каждой строке, чтобы хватило для большого числа
                for(i=0; i<N+1; i++)
                {
                        mas[i]=new int[100];
                        for(j=0; j<100; j++)
                                mas[i][j]=0;
                }               
                mas[0][0]=1;// в нулевой строке 1 - нулевая строка это земля (даже не первая ступень)
        rekursia(1, K, N, mas);// вызываем рек.функцию в параметрах передаем, что текущая рассматриваемая ступенька - первая, а также передаем значения K,M, и адрес mas[][]
                int fl=1;
                for(i=99; i>=0; i--)
                {
                        if(!fl)
                                printf("%d", mas[N][i]);
                        if(fl && mas[N][i])
                        {
                                fl=0;
                                printf("%d", mas[N][i]);
                        }
                }
                return 0; 
}
 
void rekursia(int y, int K,int N, int **mas)  {
        if(y==N+1)// если текущая рассматриваемая ступенька имеет номер N+1, то прекращаем рекурсию
                return;
        int i=0;// в этой строке и двух ниже определяем значение i (c учетом сколько ступенек от земли)
        if(y-K>=0)
                i=y-K;
        for(; i<y; i++)// в этом цикле делаем: F(K,N)=F(K, N-1)+F(K, N-2)+...+F(K, N-K).
                for(int j=0; j<100; j++)
                        mas[y][j]+=mas[i][j];
        for(i=0; i<99; i++)// в этом цикле в строке с только что расчитанным F(K,N) делаем так что в каждом элементе число не более 9 (напоминаю, что всего элементов для хранения F(K,N) сто).
                if(mas[y][i]>9)
                {
                        mas[y][i+1]+=mas[y][i]/10;
                        mas[y][i]%=10;
                }
        rekursia(y+1, K, N, mas);// вызываем рек. функцию для следующей ступеньки.
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.01.2011, 18:55
Помогаю со студенческими работами здесь

Задача на длинную арифметику
Всем привет! Есть такая задача {deleted} на использовании длинной арифметики. Не получается её решить, кто-нибудь может помочь,...

Переделать в длинную арифметику
Здравствуйте, возникла проблема с длинной арифметикой, подскажите пожалуйста как изменить эту задачу: #include &lt;iostream&gt; ...

Задача на длинную арифметику
Итак, входные данные: число S&lt;=60000. Это s-тое число фибонначи (если 2 то 2, если 4 то 5, если 5 то 8). Нужно с помощью процедуры(или...

Задача на длинную арифметику
нужно вычислить 100! + 2^100 (2 в степени 100) и в результате сохранить все цифры.

Реализовать длинную арифметику
Здравствуйте! Не подскажете как реализовывать длинную арифметику с числами? Т.е. нужно, чтобы выполнялись базовые арифметические...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru