C-转9到0
这是我在这里的第一个问题,我是一个初学者,代码是用C(ANSIC)编写的 对于递归函数中的每个数字,代码应将数字返回为(n+1)。(123->234;801->912;239->340) 问题是,当数字9出现时,代码将其相加为1,结果为10,要求变为0。 有没有办法不用特别检查数字9就可以处理它 谢谢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
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);
}
该函数的作用是:
- 如果
小于10,则结果比其当前值(模10)大1。n
因此,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);