2.3.3 Zero Sum 和为零
时间: 1ms 内存:64M
描述:
请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。
现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将每一对数字组合在一起(请不在第一个数字前插入符号)。
计算该表达式的结果并注意你是否得到了和为零。
请你写一个程序找出所有产生和为零的长度为N的数列。
输入:
单独的一行表示整数N (3 <= N <= 9)。
输出:
按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到和为零的数列。(注意:就算两个数字之间没有插入符号也应该保留空格)
示例输入:
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
提示:
参考答案(内存最优[752]):
#include <stdio.h>
int n;
char str[20];
void dfs(int i,int t,int sum,char flag){
if(i==n){
sum+=t;
if(sum==0)
printf("%s\n",str);
return ;
}
if(flag==' '){
if(t<0)
t=t*10-i-1;
else
t=t*10+i+1;
}
else{
sum+=t;
t=i+1;
if(flag=='-')
t=-t;
}
str[2*i]=i+'1';
if(i==n-1){
str[2*i+1]=0;
dfs(i+1,t,sum,0);
return ;
}
str[2*i+1]=' ';
dfs(i+1,t,sum,' ');
str[2*i+1]='+';
dfs(i+1,t,sum,'+');
str[2*i+1]='-';
dfs(i+1,t,sum,'-');
}
int main(){
while(scanf("%d",&n)!=EOF){
dfs(0,0,0,'+');
}
return 0;
}
参考答案(时间最优[0]):
#include <stdio.h>
int n;
char str[20];
void dfs(int i,int t,int sum,char flag){
if(i==n){
sum+=t;
if(sum==0)
printf("%s\n",str);
return ;
}
if(flag==' '){
if(t<0)
t=t*10-i-1;
else
t=t*10+i+1;
}
else{
sum+=t;
t=i+1;
if(flag=='-')
t=-t;
}
str[2*i]=i+'1';
if(i==n-1){
str[2*i+1]=0;
dfs(i+1,t,sum,0);
return ;
}
str[2*i+1]=' ';
dfs(i+1,t,sum,' ');
str[2*i+1]='+';
dfs(i+1,t,sum,'+');
str[2*i+1]='-';
dfs(i+1,t,sum,'-');
}
int main(){
while(scanf("%d",&n)!=EOF){
dfs(0,0,0,'+');
}
return 0;
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。