把1-9这9个数字按从小到大的顺序排列 ,中间添上“+”和"-"可以计算的结果等于100的程序;

//本题的思路:要在“123456789”中添加加减号,那么可以将它们隔开可以是这样“ 1 2 3 4 5 6 7 8 9”,这样在他们的间隙就有空格(包括最前面的空格)9个,而这些空//格可以填写的内容只有3种情况:1.空,2.“+”3.“-”;这样算复杂度为3^9,用递归的方法实现并保存所有的集合。将得到的所有字符串进行分离并将分离的字符转化为数//字,加入到集合,最后集合相加和100比对(注意在分离时的问题,可能会导致出错,本人当时也是错了N多次)。
void getNumber1(string str, int pos, vector<string>& vec)
{
	for (int i = 0; i < 3; i++)
	{
		switch(i)
		{
		case 0:
			{
				string tem_str = str;
				char a[10];
				memset(a, 0, 10);
				itoa(pos, a, 10);
				int mypos = str.find(a);
				str.insert(mypos, ""); 
				if (pos == 9)
				{
					vec.push_back(str);
					str = tem_str;
					break;
				}
				getNumber1(str, pos + 1, vec);
				str = tem_str;
				break;
			}
		case 1:
			{
				string tem_str = str;
				char a[10];
				memset(a, 0, 10);
				itoa(pos, a, 10);
				int mypos = str.find(a);
				str.insert(mypos, "-");
				if (pos == 9)
				{
					vec.push_back(str);
					str = tem_str;
					break;
				}
				getNumber1(str, pos + 1, vec);
				str = tem_str;
				break;
			}
		case 2:
			{
				string tem_str = str;
				char a[10];
				memset(a, 0, 10);
				itoa(pos, a, 10);
				int mypos = str.find(a);
				str.insert(mypos, "+");
				if (pos == 9)
				{
					vec.push_back(str);
					str = tem_str;
					break;
				}
				getNumber1(str, pos + 1, vec);
				str = tem_str;
				break;
			}
		default: 
			break;
		}
	}
	if (pos == 8)
	{
		return;
	}
}
void main()
{
	vector<string> vec;
	getNumber1(string("123456789"), 1, vec);
	vector<string> result;
	for (int i =0; i < vec.size(); i++)
	{
		if (i == 18062)
		{
			int m =0;
		}
		string str = vec[i];
		vector<int> tem_vec;
		int count = 0;
		int flag = 1;
		while (str.find("+") != string::npos||str.find("-") != string::npos)
		{
			int pos = str.find_first_of("+");
			int pos1 =  str.find_first_of("-");
			int rpos = 0;
			if (pos1 >= 0&& pos >= 0)
			{
				if (pos > pos1)
				{
					rpos = pos1;
				}else
				{
					rpos = pos;
				}
			}else
			{
				if (pos > pos1)
				{
					rpos = pos;
				}else
				{
					rpos = pos1;
				}

			}
			int tem = atoi(str.c_str());
			tem_vec.push_back(tem);
			char ch[10];
			memset(ch, 0, 10);
			char* p = itoa(tem, ch, 10);
			int size = strlen(p);
			p[0] = p[size - 1];
			p[1] = '\0';
			int mypos = str.find_first_of(p);
			str = str.substr(mypos + 1);
		}
		for (int i = 0; i < tem_vec.size(); i++)
		{
			count+= tem_vec[i];
		}
		if (count == 100)
		{
			result.push_back(vec[i]);
		}
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值