描述
一个由1到N(n=3,4,5..9)的数字组成的递增序列:1,2,3,4...N。请在数列中插入“+”表示加法,“-”表示减法,“ ”表示连接两个数(比如1-2 3 就等于1-23),按照这样的方法将每一对数字组合在一起。计算该表达式是否为0,你写一个程序找出所有产生和为零的长度为N的数列。
输入样例:
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 1-2-3-4-5+6+7
程序代码:
#include <iostream> #include <string.h> #include <string> #include <stdlib.h> #include <stdio.h> using namespace std; int N; string ans[20]; int count; bool Judge(char *s){ string t,strt1,strt2; int num[11],j=0,n=0,m=0,sum=0,k,i; char tem[10],mark[9]; t = s; for(i=0; i < t.length(); i++){ if(t[i] == ' ') t.erase(i,1); } for(i=0; i <= t.length(); i++) { if(t[i] == '+' || t[i] == '-' || i==t.length()) { mark[m++] = t[i]; strt1 = t.substr(j,i-j); for(k=0;k<i-j;k++) tem[k] = strt1[k]; tem[k] = '\0'; num[n++]=atoi(tem); j=i+1; } } sum=num[0]; for(i=0;i<n;i++) { switch (mark[i]) { case '+': sum += num[i+1]; break; case '-': sum -= num[i+1]; break; } } if(sum==0) return true; else return false; } void Function(int t,bool b,char* s) { int i; if(t==N+1){ if(Judge(s)) ans[count++]=s; return; } if(b){ char s2[2]; sprintf(s2,"%d",t); strcat(s,s2); Function(t+1,!b,s); s[strlen(s)-1]=0; }else{ char e[3]={'+','-',' '}; for(i=0;i<3;++i){ char s2[2]; s2[0]=e[i]; s2[1]=0; strcat(s,s2); Function(t,!b,s); s[strlen(s)-1]=0; } } } int main() { int i,j; while(cin >> N) { count = 0; char s[20]={0}; Function(1,1,s); for(i=0;i<count-1;i++) for(j=i+1;j<count;j++) if(ans[i]>ans[j]) ans[i].swap(ans[j]); for(i=0;i<count;i++) cout<<ans[i]<<endl; } return 0; }