Problem W 数字表达式问题(第四讲)

题目描述
输入一串数字,在数字之间插入若干加号、减号、乘号,使得形成的表达式计算结果为2000。表达式里的整数不能有前导0,不能有负号,数字不超过9个。按字典序从小到大输出多组解,无解输出“IMPOSSIBLE”。

输入
在一行输入数字个数n,然后连续输入这n个数字。遇到文件末尾结束。

输出
在一行输出一个可能的表达式,如无解输出IMPOSSIBLE。

样例输入
7
2100100
样例输出
2*100*10+0=2000
2*100*10-0=2000
2100-100=2000

此代码C++编译器运行
 

 

#include <vector>
#include <iostream>
using namespace std;

int a[9],n,k; //a读入的数字,n读入的数字个数,k解的个数
char s[8]; //插入数字间的符号

void calc() //计算表达式的值
{
	int i,t;
	vector<int> va,va1;
	vector<char> vs,vs1;
	va.clear(); 
	vs.clear();
	va1.clear(); 
	vs1.clear();

	t=a[0]; //消空格,处理结果存入va和vs
	for(i=0;i<n-1;i++)
	{
		if(s[i]==' ')
		{
			if(t==0) return; //不处理有前导0的情况
			t=t*10+a[i+1];
		}
		else
		{
			va.push_back(t);
			vs.push_back(s[i]);
			t=a[i+1];
		}
	}
	va.push_back(t);

	t=va[0]; //计算乘法,处理结果存入va1和vs1
	for(i=0;i<vs.size();i++)
	{
		if(vs[i]=='*')
			t*=va[i+1];
		else
		{
			va1.push_back(t);
			vs1.push_back(vs[i]);
			t=va[i+1];
		}
	}
	va1.push_back(t);

	t=va1[0]; //计算加减
	for(i=0;i<vs1.size();i++)
		if(vs1[i]=='+') t+=va1[i+1]; else t-=va1[i+1];

	if(t==2000) //输出和统计解的个数
	{
		for(i=0;i<vs.size();i++) cout<<va[i]<<vs[i];cout<<va[i]<<"="<<t<<endl;
		k++;
	}
}

void fillsymb(int p)
{
	if(p==n-1)
	{
		calc();
		return;
	}
	s[p]='*';
	fillsymb(p+1);
	s[p]='+';
	fillsymb(p+1);
	s[p]='-';
	fillsymb(p+1);
	s[p]=' ';
	fillsymb(p+1);
}

int main()
{	
	int i;
	char x;
	while(cin>>n)
	{
		for(i=0;i<n;i++)
		{			
			cin>>x;
			a[i]=x-'0';
		}
		k=0;
		fillsymb(0);
		if(k==0) cout<<"IMPOSSIBLE"<<endl;
	}
	return 0;
}

 

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值