2014华为面试题

描述:    输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5

1+23+4-5+6-7-8-9 = 5

样例输入:    5
样例输出:    21

请编写程序,统计满足该输入整数的所有等式的个数。

思路:考虑每个间隔的三种可能,并对剩余元素进行递归调用count函数,

firstNum:表示当前所计算元素的首个元素值(并不一定是NumList[0]); 

numList:表示当前所剩余元素集合,

x:表示当前利用剩余元素集合生成的目标值(可正可负也可能为零); 

n:表示剩余元素个数

int count(int firstNum,int numList[],int x,int n)
{
	//思路,每个空格之间有三种可能,+/-/' ',如何进行处理,

	//printf("%d",numList[0]);
	if (n == 1)
	{
		if (x == firstNum)
			return 1;
		else
			return 0;
	}
	else
	//对num中的元素进行组合,使得其结果 == x,对数组中的首个元素和其之后的内容进行组合
	{
		int count1 = count(numList[1],numList + 1,x - firstNum,n - 1);//+
		int count2 = count(numList[1],numList + 1,firstNum - x,n - 1);//-

		firstNum = firstNum * 10 + numList[1];//将首个元素与第二个元素直接合并,不添加操作符
		int count3 = count(firstNum,numList + 1,x,n - 1);
		return count1 + count2 + count3;
	}
}
测试代码:

	int result = count(1,numList,5,9);
	printf("%d\n", result);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值