题目描述
请考虑一个由1到N(N=3,4,5......9)的数字组成的递增数列:1 2 3......N。
现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将每一对数字组合在一起(请不在第一个数字前插入符号)。
计算该表达式的结果并注意你是否得到了和为零。
请你写一个程序找出所有产生和为零的长度为N的数列。
输入输出格式
输入格式:
单独的一行表示整数N(3≤N≤9)。
输出格式:
按照ASCII码的顺序,输出所有在每对数字间插入“+”,“-”,或 “ ”后能得到和为零的数列。(注意:就算两个数字之间没有插入符号也应该保留空格)
输入输出样例
输入样例:
7
输出样例:
View Code
1+2-3+4-5-6+7 1+2-3-4+5+6-7 1-2 3+4+5+6+7 1-2 3-4 5+6 7 1-2+3+4-5+6-7 1-2-3-4-5+6+7、
思路;水题,依次插入+,-, ,计算结果。
//程序名:新的C++程序 //作者: #include<stack> #include<iostream> #include<fstream> #include<algorithm> using namespace std; int n,u; string s,ans[105]; int js(string s) { stack<int> r; stack<char> w; int f=0,h=0,sum=0,d=0; char y; for(int i=0;i<s.size();i++) { if(!r.empty())f=r.top();d=0; while((s[i]>='0'&&s[i]<='9')||s[i]==' ') { if(s[i]==' ')i++; d*=10; d+=(s[i]-48); i++; } if(d!=0) { if(h==0)r.push(d); if(h==1) { r.pop(); r.push(f*d); h=0; } if(h==2) { r.pop(); r.push(f/d); h=0; } } if(s[i]=='+'||s[i]=='-')w.push(s[i]); if(s[i]=='*') { h=1; } if(s[i]=='/') { h=2; } } while(!r.empty()) { f=0;y=0; f=r.top(); r.pop(); if(!w.empty()) { y=w.top(); w.pop(); } if(y=='-')sum+=-f; else sum+=f; } return sum; } void dfs(int m) { if(m==n) { if(js(s)==0)ans[++u]=s; return; } for(int i=1;i<=3;i++) { if(i==1)s[m*2-1]=' '; else if(i==2)s[m*2-1]='+'; else s[m*2-1]='-'; dfs(m+1); s[m*2-1]=' '; } } int main() { cin>>n; for(int i=1;i<n;i++)s+=i+'0',s+=' ';s+=n+'0'; dfs(1); sort(ans+1,ans+1+u); ans[u+1]=ans[u]+'1'; for(int i=1;i<=u;i++)if(ans[i]!=ans[i+1])cout<<ans[i]<<endl; return 0; }