C - 将 9 转为 0

C - turn 9 to 0

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

代码应该 return 递归函数中每个数字的数字为 (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;
}

程序输出为

0: 1
9: 0
13: 24
801: 912
239: 340

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

unsigned swap (unsigned n) {
    if (n < 10) return ++n % 10;
    return 10 * swap(n/10) + swap(n%10);
}

这个函数说的是:

  • 如果n小于10,则结果比其当前值大1,modulo 10。
    因此,9将变为(10 mod 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;
}

交换调用函数确定整数参数的长度,然后显示任何必要的前导零。

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);