"Имеется лестница, состоящая из N ступенек. При подъеме по лестнице заяц может прыгать на любое количество ступенек от 1 до K. Сколько у зайца способов подъема по лестнице?
Ввод из файла INPUT.TXT. Единственная строка содержит целые положительные числа N и K."
С ограничение 0 < N < 35.
Ну, как мне казалось я разобралась с задачей, но серьезно ошиблась, когда дело дошло до проверки. При заданных N=35 и K=7+(до 35) у меня получается слишком длинное число.
Код: Выделить всё
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
int n, k, ch, ways, w, i, j;
//Процедура подсчета путей зайца
int findways(int n, int k)
{
int *s = (int *)calloc(n + 1, sizeof(int));
//заполняем массив нулями
memset(s, 0, n + 1);
//начальные случаи
s[0] = 1;
s[1] = 1;
if (k <= 1 || n <= 0)
return 1;
else
for (i = 2; i < n + 1; i++)
/* количество путей для данного i равно сумме количеств путей
для k предыдущих i или для всех i, если i - k < 0 */
for ((i - k < 0) ? (j = 0) : (j = i - k); j < i; j++)
s[i] += s[j];
ways = s[n];
free(s);
if (ways > 100)
{
w = getc(ways)
return ways;
}
int main(void)
{
//Создание и проверка на существование файлов
FILE *IFile, *OFile;
if((IFile = fopen("Input.txt", "r")) == NULL)
{
printf("Can't open Input file.\n");
return 1;
}
if((OFile = fopen("Output.txt", "w")) == NULL)
{
printf("Can't open Output file.\n");
return 1;
}
//Считывание значений из файла
fscanf(IFile, "%d %d", &n, &k);
if (n > 35)
{
printf("not correct n \n");
fprintf(OFile, "not correct n");
}
else
{
//Запись получившегося значения путей в файл и закрытие файлов
fprintf(OFile, "%d", findways(n, k));
}
fclose(IFile);
fclose(OFile);
return 0;
}
Пример: N=35 K=7 Output: -1886316324