首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

数字序列和为0-一串数字 添加符号 使其结果为0

2013-10-21 
数字序列和为0--一串数字 添加符号 使其结果为0题目:序列123...N,N介于3和9之间,在其中加入、-或者空,使其

数字序列和为0--一串数字 添加符号 使其结果为0

题目:序列123...N,N介于3和9之间,在其中加入+、-或者空格,使其和为0。如123456  1-2 3-4 5+6 7 等价于1-23-45+67=0。请问,如何获得所有组合?

思路:

由于N是从3至9的范围,解决方案就是针对每个N的取值,先计算三个分隔符“_ + -”填入序列1-N的所有可能组合的情况总数设置所有情况的组合序列(采用3进制的思想,即set函数)对每种组合计算表达式值,如果为0则输出(利用栈&状态机,calculate函数)

#include <iostream>#include <string>using namespace std; /* parameter description * * N,1-N 的数字串 * k,处理到第几个字符了,k范围[1-N] * val,当前表达式的值 * result,结果字符串 * pre,记录前一个操作符,用于遇到空格时考虑 */void dfs(int N, int k, int val, string& result, char pre){    if(k > N)    {        if(val == 0)        {            printf("%s\n", result.c_str());        }        return;    }    /* deal space */    int val_space = val;    if(pre == '-')    {        val = val+(k-1)-((k-1)*10+k); //在上一次的操作上,首次是符号入栈 然后是数字如栈 在这里需要将上一次的数字转换    }else if(pre == '+')    {        val = val-(k-1)+((k-1)*10+k);    }else    {        val = val * 10 + k;    }    result.push_back(' ');    result.push_back(k + '0');    dfs(N, k+1, val, result, ' ');     val = val_space;    result.pop_back();    result.pop_back();     /* deal + */    val += k;    result.push_back('+');    result.push_back('0' + k);    dfs(N, k+1, val, result, '+');     val -= k;    result.pop_back();    result.pop_back();     /* deal - */    val -= k;    result.push_back('-');    result.push_back('0' + k);    dfs(N, k+1, val, result, '-');     val += k;    result.pop_back();    result.pop_back();} void main(){    string res = "1";    for(int i = 3; i <= 9; ++i)    {        dfs(i, 2, 1, res, ' ');    }}
    这个思路就非常简单了,就是使用基本的搜索的方法来计算最终的结果是否有0.如果有0




热点排行