Как я могу объединить целое число с желаемым временем в с? - PullRequest
1 голос
/ 29 апреля 2019

Я хочу написать такую ​​функцию:

int number_maker(int n, int k)
{
    if(k==1)
        return n;
    else
    {
        int x = 10;

        while(n >= x)
            x *= 10;

        return (n*x) + number_maker(n,k-1) ;
    }
}

Например, скажем, мой номер 350.Я хочу сделать это на основе повторного параметра.Я могу сделать это 350350, но когда речь идет о большем количестве повторений, например, 3 или 4 раза, все идет не так.

Я не могу использовать стандартные функции Си.

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Хотя можно повторить любое трехзначное повторение в 32-разрядном int, три раза невозможно выполнить четыре повторения, поскольку могут быть представлены только все 9-значные десятичные целые числа.

Ваша проблема с тремя повторениями состоит в том, что для каждой рекурсии x всегда равно 1000 (для трехзначного n), тогда как на самом деле вам нужно, чтобы оно было 1000000 для второй рекурсии. Решить это несколько громоздко, но вам нужно передать x в number_maker таким образом:

int number_maker(int n, int k, int x)  // <<< additional parameter
{
    if(k==1)
        return n;
    else
    {
       int xx = x ;                    // <<< added
       while(n * xx >= x)              // <<< modified
            x *= 10;

        return (n*x) + number_maker(n,k-1, x) ;
    }
}

Затем вызов, такой как:

printf("%d", number_maker( 350, 3, 1 ) );

будет работать. Это громоздко, потому что вы должны передать начальное значение x, и это может быть только 1. В C ++ вы можете использовать аргумент по умолчанию, чтобы скрыть это.

Однако он не будет работать для 4 повторений или трехзначного десятичного целого числа.

Это говорит:

printf("%d", number_maker( 1, 9, 1 ) );
printf("%d", number_maker( 9, 9, 1 ) );

работает нормально. Вы можете сойти с 10 повторений только за n==1.

printf("%d", number_maker( 1, 10, 1 ) );

По существу это работает для всех 9-значных результатов и (менее полезно) некоторых 10-значных результатов.

Использование целых чисел без знака увеличит число 10-значных результатов, которые могут быть представлены, но, возможно, это не особенно полезно.

1 голос
/ 29 апреля 2019

Ваша программа пытается сохранить число больше INT_MAX в int, что приводит к переполнению во время преобразования. Даже если вы измените свою функцию так, чтобы она возвращала тип size_t, это только покажет вам. Единственный способ убедиться, что ваша программа выдает точные выходные данные, - сохранить объединенное целое число как char* и вернуть его вместо этого.

...