由一个小学五年级暑假作业想到的算法问题

题目:
从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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值