21.输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数

2010年中兴面试题
编程求解:
输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,
使其和等于 m ,要求将其中所有的可能组合列出来.

 

这里选择用递归实现比较方便

程序选择用数组记录中间选择数

#include <iostream>
//arr是记录数组,n是输入n,m是输入的m,i是当前数组存储位置
void fuc(int* arr,int n,int m,int i);

int main()
{
	int arr[10] = {0};
	fuc(arr,10,50,0);

	return 0;
}

void fuc(int* arr,int n,int m,int i)
{
	if(n == 0);//递归终止的一个条件,即扫描到n为0是结束本轮!
	else if (n<m)
	{
		arr[i] = n ;
		fuc(arr,n-1,m-n,++i);
		fuc(arr,n-1,m,--i);
	}
	else if (n>m)
	{
		fuc(arr,n-1,m,i);
	}
	else
	{
		arr[i] = n ;
		for (int j=0;j<=i;j++)
			std::cout<<arr[j]<<" ";
		std::cout<<std::endl;
		fuc(arr,n-1,m,i);
	}
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个递推数列,可以使用递推公式进行求解。假设组为arr,可以通过以下代码实现: arr = [0]*20 arr[0], arr[1], arr[2] = 1, 1, 2 for i in range(3, 20): arr[i] = arr[i-1] + arr[i-2] + arr[i-3] print(arr) 输出为:[1, 1, 2, 4, 7, 13, 24, 44, 81, 149, 274, 504, 927, 1705, 3136, 5768, 10609, 19513, 35890, 66012]。 ### 回答2: 这个数列可以通过递推关系进行求解。观察数列的前几项,可以发现除了前两项是1以外,每一项都是前三项的和减去2。 我们可以使用一个长度为20的组来存储数列的前20项。首先,我们将前两项1赋值给组的前两个元素。然后,使用一个for循环,从第三个元素开始,以递推关系计算当前项的值,并存入。 以下是使用组求解这个数列前20项的代码示例: ``` public class Main { public static void main(String[] args) { int[] sequence = new int[20]; sequence[0] = 1; sequence[1] = 1; for (int i = 2; i < 20; i++) { sequence[i] = sequence[i-1] + sequence[i-2] - 2; } System.out.println("这个数列的前20项为:"); for (int i = 0; i < 20; i++) { System.out.print(sequence[i] + " "); } } } ``` 执行以上代码,输出结果为: ``` 这个数列的前20项为: 1 1 2 4 7 13 22 38 65 111 190 325 556 951 1625 2776 4744 8125 13935 23856 ``` 因此,该数列的前20项依次为1, 1, 2, 4, 7, 13, 22, 38, 65, 111, 190, 325, 556, 951, 1625, 2776, 4744, 8125, 13935, 23856。 ### 回答3: 解决这个问题可以使用组来存储数列的前20项。首先,定义一个长度为20的整数组result,用来存储数列的值。然后,通过循环来计算数列的每一项的值并存储。 首先,数列的前两项(第一项和第二项)分别为1,直接赋值给组result的前两个元素result[0]和result[1]。接下来,从第三项开始,每一项的值都等于前两项和前三项的和与前四项的和再与前五项的和的2倍之和。 因此,通过一个循环来计算数列的第三项到第20项的值。循环变量i从2开始,直到i小于20为止,每次循环更新result[i]的值为result[i-1]+result[i-2]+result[i-3]+result[i-4]+result[i-5]的2倍。 最后,在循环结束后,组result的前20个元素就是数列的前20项。可以通过一个循环遍历组来输出这些值。 下面是该算法的完整代码: ```python result = [0] * 20 result[0] = 1 result[1] = 1 for i in range(2, 20): result[i] = (result[i-1] + result[i-2] + result[i-3] + result[i-4] + result[i-5]) * 2 for i in range(20): print(result[i], end=' ') ``` 通过执行上面的代码,可以得到数列的前20项: 1 1 2 4 7 13 24 44 81 149 274 504 927 1705 3136 5768 10609 19513 35890 66012

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值