Ключевая проблема заключается в этой логике:
(int(*ch))*10+successor(ch+1)
умножение на 10 недостаточно для больших чисел.Нам нужно умножить на степень 10, и мы уже рассчитали эту мощность, но не зависели от нее:
strlen (ch)
или, более конкретно:
strlen(ch) - 1
Полное решение:
#include <math.h>
#include <stdio.h>
#include <string.h>
#define digit(c) (c - '0')
int successor(char *string)
{
size_t power = strlen(string) - 1;
if (power == 0)
{
return digit(*string) + 1;
}
return digit(*string) * pow(10, power) + successor(string + 1);
}
int main() {
printf("%d\n", successor("2999"));
return 0;
}
ВЫХОД
> ./a.out
3000
>
TODO
Что произойдет, если successor()
будет передана пустая строка:
printf("%d\n", successor(""));
Как вы можете изменить код, чтобы это исправить?Сначала решите, что функция должна вернуть в этой ситуации.Что произойдет, если successor()
будет передана строка, представляющая число, слишком большое, чтобы быть в int
:
printf("%d\n", successor("8589934592"));
Как вы можете изменить код, чтобы исправить это?Опять же, сначала решите, что функция должна вернуть в этой ситуации.