递归地增加自然数的数字

时间:2018-01-04 11:26:41

标签: c

我想制作一个自然数字并创建一个新数字的函数,这样旧数字中的每个数字都会递增,如果数字为9,它将变为零,但不会特别检查数字是否为9 。 例: 930将返回41 9999将返回0 879021将返回980132。

这是我到目前为止所得到的:

int newNumber(int n)
{
    int dig;
    if (n < 9)
        return n + 1;

    dig = n % 10;
    dig++;
    n = n / 10;
    n = n * 10 + dig;

    return newNumber(n/10);
}

5 个答案:

答案 0 :(得分:2)

您的代码存在以下几个问题:   它不会处理9的单个数字(这会导致堆栈溢出)。   添加1到9会使10不为0.

我已经通过您提供的示例数据运行它,它似乎可以工作(在C#中),并且它最后有一个硬核递归行。

    int newNumber(int n)
    {
        if (n == 9)
            return 0;
        if (n < 9)
            return n + 1;
        return (newNumber(n / 10) * 10) + newNumber(n % 10);
    }

答案 1 :(得分:1)

这是为了避免检查n == 9

int newNumber(int n)
{
    static int table[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };

    return (n <= 9) ? table[n] : (newNumber(n / 10) * 10) + newNumber(n % 10);
}

查找table似乎是最合适的,并且完全符合要求所描述的内容。尝试使用不兼容的算术运算符会产生副作用(例如我们在Bathsheba's answer中看到的那样),然后需要更正。

答案 2 :(得分:1)

unsigned newNumber(unsigned n, unsigned c = 0)
{
    return n ? (n + 1) % 10 + 10 * newNumber(n / 10, 1 + c) : !c;
}

是一种方式,它会将0视为1,通过!c分支,其中c计算递归次数。注意三元条件分支中的尾递归 - 一些编译器会优化尾递归到一个简单的循环,参见What is tail recursion?

答案 3 :(得分:1)

通过使用三元运算符,上面公布的Bathsheba解决方案非常优雅,但如果输入为零,则会给出错误的结果。为避免这种情况,您可以使用存根函数:

#include <stdio.h>

int incDigits(int n)
{
    return n ? (n + 1) % 10 + incDigits(n / 10) * 10 : 0;
}

int newNumber(int n)
{
    return n ? incDigits(n) : 1;
}

int main()
{
    for(int i = 0; i <= 100; ++i)
    {
        int n = newNumber(i);
        printf("%d -> %d\n", i, n);
    }
}
编辑:用户意义事项也发布了一种使用查找表修复输入值问题的方法,但他仍然需要检查n是否等于9,这是你不想要的。所以我认为使用存根函数仍然是最好的方法。

答案 4 :(得分:-1)

已经使用两个三元运算符来处理这两种情况: i)数字等于9 ii)数字不等于9 =&gt;另一个三元运算符用于处理另外两种可能的情况: a)大于9的数字(num(n / 10)* 10和num(n%10)的返回总和);这可以根据输入num函数的参数进一步详细说明。 b)小于9的数字(返回数加一(n + 1))

一旦从main函数调用此函数,其参数等于要以问题中提出的方式转换的数字,则line4中的每个调用都将进行递归,直到它们将参数传递给后续迭代小于或等于9(导致递归终止)。通过对递归的基本理解,可以在下面的子程序的上下文中容易地理解上述段落。

  

块引用

int num(int n)// line1 {// 2号线 int t; // line3 T =(N == 9 0:?(N&GT; 9 NUM(N / 10)* 10 + NUM(N%10)中,n + 1)); // 4号线 return t; / line5 } // LINE6

  

块引用

相关问题