C 自然数的递归递增位数

C 自然数的递归递增位数,c,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 =

我想做一个函数,它将取一个自然数并生成一个新的数,这样旧数中的每个数字都将递增,如果数字是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);
}
int newNumber(int n)
{
内挖;
if(n<9)
返回n+1;
dig=n%10;
dig++;
n=n/10;
n=n*10+dig;
返回新编号(n/10);
}

您的代码有几个问题: 它不处理单个数字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);
    }
int newNumber(int n)
{
如果(n==9)
返回0;
if(n<9)
返回n+1;
返回(新编号(n/10)*10)+新编号(n%10);
}

以下是避免检查
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);
}
int newNumber(int n)
{
静态int表[]={1,2,3,4,5,6,7,8,9,0};
返回(n

是一种方法,它将通过
!c
分支将
0
视为
1
,其中
c
计算递归的数量。注意三元条件分支中的尾部递归-一些编译器将尾部递归优化为一个简单循环,请参阅上文发布的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)
{
返回n?(n+1)%10+10位数(n/10)*10:0;
}
int newNumber(int n)
{
返回n个数字(n):1;
}
int main()
{

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

一旦从主函数调用此函数,参数等于问题中要求转换的数字,第4行中的每个调用都将进行递归,直到它们将参数传递到小于或等于9的后续迭代(这导致递归终止).通过对递归的基本理解,上述段落可以在下面的子程序上下文中轻松理解

大宗报价

int num(int n)//line1 {//line2 int t;//第3行 t=(n==9?0:(n>9?num(n/10)*10+num(n%10):n+1));//第4行 返回t;/line5 }//第6行

大宗报价


不要使用制表符来索引代码!!!那么你在哪里挣扎?是什么阻止你完成任务?@means matters:yes,准确地说是041@means matters我明白了,这是因为930->041->41首先你根本没有处理9这件事。第二,你的最后一行完全错了。请付出更多的努力。谢谢,我正在努力在没有具体检查n=9@piscoony如果需要,请尝试
(n@meaning-重要的yup@Persixty是的,我正在学习c中的递归函数,并尝试将此作为一个挑战,在不使用n==9的情况下执行此操作,然后返回0是的,这比我的答案更清楚,因为我的答案接近于模糊处理。编写
n<10
可能会让OP高兴,因为9消失了。请投票。@Bathsheba i我觉得我们可以通过将你漂亮的尾部递归与我的查找表相结合来获得最佳解决方案。(但现在正忙于处理其他事情。)我解决了这个问题。仍然是一行,但使用存根函数更清晰。请向上投票。谢谢!我真的很欣赏可读性,但作为一名极简编码员,我也喜欢你的新解决方案。
#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);
    }
}