/*
输入一个正整数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
*/
这个方法是转载的,可以看懂可以运行,暴力解法,如果谁有更好 的方法,可以讨论下,欢迎拍砖!~
输入一个正整数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;
}
这个方法是转载的,可以看懂可以运行,暴力解法,如果谁有更好 的方法,可以讨论下,欢迎拍砖!~