程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 尋找表達式

尋找表達式

編輯:C++入門知識

題目描述:
現在有一個序列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(‘_’代表空格

 

#include <stdio.h>

int op[20];
char s[3] = {'+','-',' '};
int n;
void dfs(int layer,int currentSum,int lastOp,int lastSum){
	lastSum *= (layer > 9 ? 100 : 10);
	lastSum += layer;
	if(layer == n){
		currentSum += (lastOp) ? (-1 * lastSum) : lastSum;
		if(currentSum == 0){
			printf("1");
			for(int i = 2;i <= n;i++)
				printf("%c%d",s[op[i - 1]],i);
			printf("\n");
		}
		return;
	}

	op[layer] = 2;
	dfs(layer + 1,currentSum,lastOp,lastSum);
	currentSum += (lastOp) ? (-1 * lastSum) : lastSum;
	op[layer] = 0;
	dfs(layer + 1,currentSum,0,0);
	op[layer] = 1;
	dfs(layer + 1,currentSum,1,0);
}


int main(){
	while(scanf("%d",&n) != EOF){
		dfs(1,0,0,0);
	}
	return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved