我想制作一个自然数字并创建一个新数字的函数,这样旧数字中的每个数字都会递增,如果数字为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);
}
答案 0 :(得分:2)
您的代码存在以下几个问题: 它不会处理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);
}
答案 1 :(得分:1)
这是为了避免检查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);
}
查找table
似乎是最合适的,并且完全符合要求所描述的内容。尝试使用不兼容的算术运算符会产生副作用(例如我们在Bathsheba's answer中看到的那样),然后需要更正。
答案 2 :(得分:1)
unsigned newNumber(unsigned n, unsigned c = 0)
{
return n ? (n + 1) % 10 + 10 * newNumber(n / 10, 1 + c) : !c;
}
是一种方式,它会将0
视为1
,通过!c
分支,其中c
计算递归次数。注意三元条件分支中的尾递归 - 一些编译器会优化尾递归到一个简单的循环,参见What is tail recursion?
答案 3 :(得分:1)
#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是否等于9,这是你不想要的。所以我认为使用存根函数仍然是最好的方法。
答案 4 :(得分:-1)
已经使用两个三元运算符来处理这两种情况: i)数字等于9 ii)数字不等于9 =&gt;另一个三元运算符用于处理另外两种可能的情况: a)大于9的数字(num(n / 10)* 10和num(n%10)的返回总和);这可以根据输入num函数的参数进一步详细说明。 b)小于9的数字(返回数加一(n + 1))
一旦从main函数调用此函数,其参数等于要以问题中提出的方式转换的数字,则line4中的每个调用都将进行递归,直到它们将参数传递给后续迭代小于或等于9(导致递归终止)。通过对递归的基本理解,可以在下面的子程序的上下文中容易地理解上述段落。
块引用
int num(int n)// line1 {// 2号线 int t; // line3 T =(N == 9 0:?(N&GT; 9 NUM(N / 10)* 10 + NUM(N%10)中,n + 1)); // 4号线 return t; / line5 } // LINE6
块引用