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);
这是我的第一个问题,我是初学者,代码是用 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);