您的位置:首页 > 其它

华为机试题第三题

2015-09-13 11:18 211 查看
/*

输入一个正整数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;
}


这个方法是转载的,可以看懂可以运行,暴力解法,如果谁有更好 的方法,可以讨论下,欢迎拍砖!~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: