C-转9到0

C-转9到0,c,function,recursion,definition,digits,C,Function,Recursion,Definition,Digits,这是我在这里的第一个问题,我是一个初学者,代码是用C(ANSIC)编写的 对于递归函数中的每个数字,代码应将数字返回为(n+1)。(123->234;801->912;239->340) 问题是,当数字9出现时,代码将其相加为1,结果为10,要求变为0。 有没有办法不用特别检查数字9就可以处理它 谢谢 int swap(int num) { int a,b; if (num/10==0) return num+1; else { a

这是我在这里的第一个问题,我是一个初学者,代码是用C(ANSIC)编写的

对于递归函数中的每个数字,代码应将数字返回为(n+1)。(123->234;801->912;239->340)

问题是,当数字9出现时,代码将其相加为1,结果为10,要求变为0。 有没有办法不用特别检查数字9就可以处理它

谢谢

int swap(int num)
{
    int a,b;
    if (num/10==0)
        return num+1;
    else
    {
        a = num % 10;
        a++;
        b = swap(num / 10);
        return (b * 10) + a;
    }
}

为了在不检查的情况下获得下一个数字,您只需使用MOD运算符%进行换行。
因此,
a=(num%10+1)%10
或者更简单的
a=(num+1)%10
,正如Michael所指出的,你的意思似乎是

#include <stdio.h>

unsigned int increase_digits( unsigned int n )
{
    const unsigned int Base = 10;

    return ( n + 1 ) % Base + ( n / Base == 0  ? 0 : Base * increase_digits( n / Base ) ); 
}

int main(void) 
{
    unsigned int n = 0;

    printf( "%u: %u\n", n, increase_digits( n ) );

    n = 9;

    printf( "%u: %u\n", n, increase_digits( n ) );

    n = 13;

    printf( "%u: %u\n", n, increase_digits( n ) );

    n = 801;

    printf( "%u: %u\n", n, increase_digits( n ) );

    n = 239;

    printf( "%u: %u\n", n, increase_digits( n ) );

    return 0;
}

递归地,最简单的方法是:

unsigned swap (unsigned n) {
    if (n < 10) return ++n % 10;
    return 10 * swap(n/10) + swap(n%10);
}
无符号交换(无符号n){
如果(n<10)返回+n%10;
返回10*交换(n/10)+交换(n%10);
}
该函数的作用是:

  • 如果
    n
    小于10,则结果比其当前值(模10)大1。
    因此,9将变为(10模10),即0
  • 否则,对最后一个数字和其余数字递归应用算法。
    这里的技巧是将原始数字除以10,然后将接收到的结果乘以10,得到其余数字

为输入
99
而打印
00
的版本

int swap(int num) {
     return num/10 ?
        swap(num/10)*10 + ((num % 10 + 1)%10) :
        (num % 10 + 1) % 10;
}
swap caller函数确定integer参数的长度,然后显示任何必要的前导零

void caller(int num) {
     char s[20];             // Assume an int as at most 19 chars...
     sprintf (s, "%d", num); // Could also use log or a loop...

     printf("result: %0*d\n", (int)strlen(s), swap(num));    
}
把它当作

caller(mynumber);

它难道不能写成
a=(num+1)%10?@Michael Corner:
(num+1)%10
可能溢出
(num%10+1)%10
永远不会溢出。如果您希望结果为“0000”,直接使用用户输入(字符串)不是更好吗?否则,
swap()
调用者需要使用一些
printf%N0d
…感谢您的快速响应!我已经删除了我以前的评论,很抱歉弄得一团糟。假设用户输入了9999,所需的结果是0而不是10000。
return(num+1)%10
OP的值如何?@chux将为0。虽然
Base
提供了外观泛型,但它似乎不适合作为函数体中定义的常量。我可能会试图改变测试的意义,以便删除
==0
部分,并将测试更改为
n/=Base
,这样表达式就不会在递归调用中重复(当然,我必须检查是否需要为初始
(n+1)%Base
添加序列点)。尽管如此,还是向上投票。关于
999
,结果不应该是
000
(就像我的解决方案中的那样:-)@RingØ不,我的评论搞砸了,很抱歉,但是你的回答对我也很有帮助。谢谢非常感谢。这将对我非常有帮助。在前导9变为前导0的情况下,我可能希望用负值表示该条件(如
93
->
-104
),调用者计算出负值意味着在更改符号后需要删除前导数字。向上投票。
caller(mynumber);