Zero Sum
Consider the sequence of digits from 1 through N (where N=9) in increasing order: 1 2 3 ... N.
Now insert either a `+' for addition or a `-' for subtraction or a ` ' [blank] to run the digits together between each pair of digits (not in front of the first digit). Calculate the result that of the expression and see if you get zero.
Write a program that will find all sequences of length N that produce a zero sum.
PROGRAM NAME: zerosum
INPUT FORMAT
A single line with the integer N (3 <= N <= 9).
SAMPLE INPUT (file zerosum.in)
7
OUTPUT FORMAT
In ASCII order, show each sequence that can create 0 sum with a `+', `-', or ` ' between each pair of numbers.
SAMPLE OUTPUT (file zerosum.out)
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
USACO_2.3-3:zerosum零的算式和
Time Limit:1000MS Memory Limit:65536K
Total Submit:6 Accepted:4
Description
请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将每一对数字组合在一起(请不在第一个数字前插入符号)。计算该表达式的结果并注意你是否得到了和为零。请你写一个程序找出所有产生和为零的长度为N的数列。
Input
PROGRAM NAME: zerosum
单独的一行表示整数N (3 <= N <= 9)。
Output
按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到和为零的数列。
Sample Input
7
Sample Output
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
========================= 华丽的分割线 =========================
一个DFS, 题目说了按ASCII的顺序进行输出, 也就是先' ', 再'+', 接着'-'.., 我拿到题目就写了一个程序,, DFS没写错, 就是算和的时候错了. 试着写了几个版本, 都错了..(看样子我还是不怎么滴啊~~ 狂汗'').
不说多的废话了, 代码贴上来:
/*
LANG: C
ID: zqy11001
PROG: zerosum
*/
#include <stdio.h>
#define getint(i) scanf("%d", &i)
#define putint(i) printf("%d", i)
#define ze(now, c) str[now] = c; zero(now + 1);
#define MAX 200
int n;
char str[9];
void out(void)
{
int i;
putchar('1');
for(i = 1; i < n; i++){
printf("%c%d", str[i], i + 1);
}
putchar('\n');
}
void zero(int sum, int t, int now, char s)
{
if(now == n){
if(s == '+'){
sum += t;
}else{
sum -= t;
}
if(sum == 0 && str[0] == '+'){
out();
}
return;
}
str[now] = ' ';
zero(sum, t * 10 + now + 1, now + 1, s);
if(s == '+'){
sum += t;
}else{
sum -= t;
}
str[now] = '+';
zero(sum, now + 1, now + 1, '+');
str[now] = '-';
zero(sum, now + 1, now + 1, '-');
}
int main(void)
{
int i, j;
freopen("zerosum.in", "r", stdin);
freopen("zerosum.out", "w", stdout);
getint(n);
zero(0, 0, 0, '+');
return 0;
}