我在考试中遇到了这个问题 - http://ideone.com/uMausI
代码是 -
#include <stdio.h>
int number(int n)
{
if(n == 1)
return n;
int half = n/2;
int k = 2*number(n/2) + half*half;
return (n%2)?(k+n):k;
}
int main(void) {
printf("%d",number(11));
return 0;
}
我知道要解决这些类型的问题,应该了解FUNCTION实际上在做什么。它可以为您节省大量时间,因为您不必为每种情况运行(这可能需要相当长的时间)。我改为运行案例并找到了结果。那么,我想知道这个'数字'函数实际上做了什么?如果它做了一些有意义的事情,比如计算方形或类似的东西。我无法找到它的通用答案。
答案 0 :(得分:5)
这是一个递归函数,用于计算n个自然数之和,其中'n'是递归函数的输入。
如果您尝试过一些样本输入,您可以轻松推断出它。以下是一些样本: -
输入输出
2 3
5 15
7 28
10 55
计算n个自然数之和的数学公式为: -
( n * ( n + 1 ) ) / 2
解释(感谢molbdnilo): -
假设您想要将数字从1加到100。
Compute (1 + 100) + (2 + 99) + (3 + 98) + ... + (98 + 3) + (99 + 2) + (100 + 1) =
101 + 101 + ... + 101 = 100 * 101 = 10100.
由于每个数字在求和中出现两次,所以你要找的总和是
10100/2 = 5050;
总和是
n*(n+1)/2.
(如果您为偶数'n'计算2*sum(n/2)
,您会注意到它是(nn + 2n)/4
,而sum(n)
是(2*nn + 2*n)/4)
。
添加n * n / 4到2 * sum(n / 2),得到sum(n)
)。
在回应评论时编辑: -
@halkujabra molbdnilo给出了很好的解释。
@Jonathan: - 没有整数包括数字行上的整个数字范围(没有小数部分的数字)
... -100, -50 , 0 , 50 ,100...
整数是非负整数,即
0, 50, 100
自然数: - 整数 - 0,即
1, 50, 100
答案 1 :(得分:2)
正在使用此分解进行计算:
显然,第n个三角形数字是2*number(n/2) + (n/2)*(n/2)
,加上在奇数情况下添加的最后一条线(即如果+n
,则紫色线为n % 1
。< / p>