算法分析与设计 | 递归(数的计数)

题目

要求找出具有下列性质数的个数(包括输入的自然数n):
先输入一个自然数n( n <= 1000),然后对此自然数按照如下方法进行处理:
(1)不作任何处理
(2)在它的左边加上一个自然数,但该数不能超过原数的一半
(3)加上数后,继续按此处理,直到不能再加自然数为止

输入

多个测试案例,每个测试案例为一个自然数n。

输出

输出满足以上条件的所有数的个数

分析

该题可以使用递归会比较简单,因为在n前面的数不能超过n的一半,以此类推,只要是左边的数都要不能超过右边数的一半。所以可以使用一个for循环里面i小于等于n/2,然后递归。

代码

//递归(数的计数)
#include
void sum(int m, int* count)
{
	int i=0;
	for (i = 1; i <= m / 2; i++)
	{
		(*count)++;
		sum(i, count);
	}
}
int main()
{
	int m=0,count=0;
	while (scanf("%d", &m) != EOF) {
		sum(m, &count);
		printf("%d\n", count + 1);
		count = 0;
	}
}

注意这里count是引用调用,让每次的count在原来的基础上+1,然后最后输出的count+1是因为sum()函数调用里面的情况没有算上只含有n这一个数字的情况。又因为这里是多组输入,所以要把上一组的count归零。

你可能感兴趣的:(算法设计与分析,算法,开发语言)