题目1498:寻找表达式
时间限制:1 秒
内存限制:128 兆
特殊判题:否
- 题目描述:
-
现在有一个序列123......N,其中N介于3和15之间,要求在序列之间加入+、-或者空格,使得该序列组成的数学表达式的运算结果为0。
- 输入:
-
输入可能包含多个测试样例。 对于每个测试案例,输入整数N(3<=N<=15),代表这个序列的长度。
- 输出:
-
对应每个测试案例,输出所有使得表达式结果为0的组合,当有多个组合时,按字典序进行排序输出。
- 样例输入:
-
3 6
- 样例输出:
-
1+2-3 1 2+3-4-5-6
- 提示:
-
1_2+3-4-5-6相当于12+3-4-5-6(‘_’代表空格)
- 来源:
- 微策略2013年校园招聘笔试题
思路:暴力,可以比较其他写法。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#include <vector>
#include <set>
#include <algorithm>
#include <vector>
#include <stack>
#include <math.h>
#include <stdlib.h>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
typedef long long LL ;
const int size=18 ;
struct Me{
int N ;
int choose[size] ;
Me(){} ;
Me(int n):N(n){};
LL ans(){
// 1 ' '
// 2 '+'
// 3 '-'
LL sum ,now ;
int type=2 ;
sum=0 ;
now=1 ;
choose[N]=2 ;
for(int i=1;i<=N;i++){
if(choose[i]==2||choose[i]==3){
if(type==2)
sum+=now ;
else
sum-=now ;
type=choose[i] ;
now=i+1 ;
}
else{
if(i+1<=9)
now=now*10+i+1 ;
else
now=now*100+i+1 ;
}
}
return sum ;
}
void dfs(int id){
if(id==N){
if(ans()==0){
printf("%d",1) ;
for(int i=1;i<N;i++){
if(choose[i]==1)
putchar(' ') ;
else if(choose[i]==2)
putchar('+') ;
else
putchar('-') ;
printf("%d",i+1) ;
}
puts("") ;
}
return ;
}
for(int i=1;i<=3;i++){
choose[id]=i ;
dfs(id+1) ;
}
}
};
int main(){
int n ;
while(scanf("%d",&n)!=EOF){
Me me(n) ;
me.dfs(1) ;
}
return 0 ;
}
浙公网安备 33010602011771号