构造表达式(西电上机题)

2019-04-13 13:04发布

本机环境win10+gcc-5.4 先给出这道题的简化做法,假如只有'+'、'-'这两种操作,显然这道题简单了许多。 我们可以通过枚举数字与数字之间的总共n-1个符号,假设n为5,就是枚举符号0000、0001、0010、0011、0100、0101。。。1111,1111对于二进制来表示就是数字(2^(n-1))-1 对于确定了的符号可以直接得出运算结果。 复杂度为(2^n)*(n) #include using namespace std; typedef long long ll; ll n,sum,out,q1[20];//q1的[1,n)存n-1个符号 ll cal(){ ll res=1,i=1; if(out)cout <<"1"; for(i=2;i<=n;i++){ if(q1[i-1]==0){ if(out)cout << "+"< 这道题完整版我们需要枚举多一种符号,也就是' ',把两个数字连在一起,我们可以通过预判断q1[i+1]也就是下一个符号是否为0(对应' ')来判断是否把两个数字相连接,从而得到最终答案。 复杂度(3^n)*(n) #include using namespace std; typedef long long ll; ll n,sum,out,q1[20];//q1的[1,n)存n-1个符号 ll cal(){ ll res=1,num=1,i=1,len; while(q1[i]==0){ len=i+1; while(len)num*=10,len/=10; //判断下次相连数字的位数来判断乘几次10 num+=i+1; i++; } res=num; if(out)cout << num; for(;i )