站点图标 陌路寒暄

2.3.3 Zero Sum 和为零

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;
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

退出移动版