题目:
从9到1 9个数, 相邻的两个数可以连在一起, 只使用加 和 减号连接, 使这些函数加起来的总和等于100; 例如 98 + 7 - 6 + 5 - 4 + 3 - 2 - 1 = 100.
当然 可以由98 76 等等多过两位数, 本来是找几种, 要问的是看有多少种这样的组合? 大家怎么写代码啊?
算法:
呵呵,
我的思路:
1)定义类似字符串"9*8*7*6*5*4*3*2*1",其中'*'为'+'、'-'、'|'之一,'|'是占位符,无意义。
3)群举8个'+'、'-'、'|'的排列。
2)将字符串中的'|'去掉。
3)计算字符串。
将原题转换为仅有+-运算的字符串的计算。
代码:
我也贴一个,说下方法
将1~3^8映射成运算符序列。
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
string build_expr(const string& expr, int ops)
{
string ret = expr;
int q = ops, r;
for (int i = 0; i != 8; ++i)
{
r = q % 3;
q = q / 3;
switch (r)
{
case 0:
ret.replace(ret.find('*'), 1, 1, '+');
break;
case 1:
ret.replace(ret.find('*'), 1, 1, '-');
break;
case 2:
ret.erase(ret.find('*'), 1);
break;
}
}
return ret;
}
int compute(const string& expr)
{
int ret = 0;
int right = 0;
char op = '+';
const int sz = expr.size();
for (int i = 0; i != sz; ++i)
{
if (isdigit(expr[i]))
{
right = right * 10 + expr[i] - '0';
}
if (!isdigit(expr[i]) || i == sz - 1)
{
if (op == '+')
{
ret += right;
}
else
{
ret -= right;
}
right = 0;
op = expr[i];
}
}
return ret;
}
int main(void)
{
const string str = "9*8*7*6*5*4*3*2*1";
const int maxOps = ::pow(3, 8);
for (int ops = 1; ops < maxOps; ++ops)
{
string expr = build_expr(str, ops);
if (compute(expr) == 100)
{
cout << expr << " = 100 " << endl;
}
}
return 0;
}
从9到1 9个数, 相邻的两个数可以连在一起, 只使用加 和 减号连接, 使这些函数加起来的总和等于100; 例如 98 + 7 - 6 + 5 - 4 + 3 - 2 - 1 = 100.
当然 可以由98 76 等等多过两位数, 本来是找几种, 要问的是看有多少种这样的组合? 大家怎么写代码啊?
算法:
呵呵,
我的思路:
1)定义类似字符串"9*8*7*6*5*4*3*2*1",其中'*'为'+'、'-'、'|'之一,'|'是占位符,无意义。
3)群举8个'+'、'-'、'|'的排列。
2)将字符串中的'|'去掉。
3)计算字符串。
将原题转换为仅有+-运算的字符串的计算。
代码:
我也贴一个,说下方法
将1~3^8映射成运算符序列。
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
string build_expr(const string& expr, int ops)
{
string ret = expr;
int q = ops, r;
for (int i = 0; i != 8; ++i)
{
r = q % 3;
q = q / 3;
switch (r)
{
case 0:
ret.replace(ret.find('*'), 1, 1, '+');
break;
case 1:
ret.replace(ret.find('*'), 1, 1, '-');
break;
case 2:
ret.erase(ret.find('*'), 1);
break;
}
}
return ret;
}
int compute(const string& expr)
{
int ret = 0;
int right = 0;
char op = '+';
const int sz = expr.size();
for (int i = 0; i != sz; ++i)
{
if (isdigit(expr[i]))
{
right = right * 10 + expr[i] - '0';
}
if (!isdigit(expr[i]) || i == sz - 1)
{
if (op == '+')
{
ret += right;
}
else
{
ret -= right;
}
right = 0;
op = expr[i];
}
}
return ret;
}
int main(void)
{
const string str = "9*8*7*6*5*4*3*2*1";
const int maxOps = ::pow(3, 8);
for (int ops = 1; ops < maxOps; ++ops)
{
string expr = build_expr(str, ops);
if (compute(expr) == 100)
{
cout << expr << " = 100 " << endl;
}
}
return 0;
}