华为机试题第三题

/*
输入一个正整数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
*/


//way 1:

#include<stdio.h>
#include <iostream>
using namespace std;
#include <string>
#include<algorithm>
#define MaxNumer 1000
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//最大
int sum = 0;


int create_util(int start, int end)
{
	int sum_;
	sum_ = 0;
	while (start <= end)
	{
		sum_ = sum_ * 10 + a[start++];
	}
	return sum_;
}


void create(int start,const int end, int result)//开始处理
{
	int k, temp;
	if (start>end&&result != 0)//当到达最后一个且不为0,结束
	{
		return;
	}
	if (result == 0 && start>end)
		sum++;//全局的统计数加一


	for (k = start; k <= end; k++)//从start开始以后都是进行同样的操作
	{
		temp = create_util(start, k);//计算对应的值
		create(k + 1, end, result - temp);//-
		create(k + 1, end, result + temp);//+
	}
}
int main()
{
	int X;
	while (scanf("%d", &X) != EOF)
	{
		sum = 0;
		for (int i = 0; i<9; i++)//考虑到第一个必是正数,单独考虑
		{
			int temp = create_util(0, i);//计算其对应的十进制值


			create(i + 1, 8, X - temp);//开始对{1,2,3,4,5,6,7,8,9}后面的值进行处理
		}
		cout << sum << endl;
	}
	system("PAUSE");
	return 0;
}

这个方法是转载的,可以看懂可以运行,暴力解法,如果谁有更好 的方法,可以讨论下,欢迎拍砖!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值