Description
在1、2、3、4、5、6、7、8、9、10个数中间加上加号或减号,使得到的表达式的值为自然数N,如果中间没有符号,则认为前后为一个数,如1 2 3认为是一百二十三(123)。
例如:当N=100时,表达式值为100的填法有24种。123+4+5+67-89-10=100是一种填法,1+2+3+4+56+7+8+9+10=100也是一种填法。
编写一个程序,找出使表达式的值等于N的填写方法有多少种?
Input
输入包含多组测试数据。每组测试数据一个自然数n,占据独立一行。0表示输入结束。
Output
对每组测试数据,输出一行,即使表达式的值等于n的填写方法的种数。
Sample Input
1
10
100
0
Sample Output
45
26
24
源代码:
1 #include 2 #include 3 #define size 200 4 void dfs(int cur,int data); 5 int fun(); 6 int a[9],temp=0; 7 char Shi[size]; 8 int main() 9 { 10 int data; 11 printf(" 巧解算式\n输入你要算式的结果:\n "); 12 scanf("%d",&data); 13 printf("以下为计算结果:\n"); 14 dfs(0,data); 15 if(temp) 16 printf("共有%d种可能使得算式结果为%d\n",temp,data); 17 else 18 printf("没有算式满足结果为%d\n",data); 19 return 0; 20 } 21 void dfs(int cur,int data)//采用深度优先搜索的思想,结合递归 22 { 23 if(cur==9) 24 { 25 if(fun()==data) 26 { 27 temp++; 28 printf("<->: %s=%d\n",temp,Shi,data); 29 } 30 return ; 31 } 32 a[cur]=0; 33 dfs(cur+1,data); 34 a[cur]=1; 35 dfs(cur+1,data); 36 a[cur]=2; 37 dfs(cur+1,data); 38 } 39 int fun() 40 { 41 int i,j,k,g=1; 42 long sum=0,t; 43 k=1; 44 j=0; 45 Shi[0]='1'; 46 for(i=0,t=1;i<9;i++,g++) 47 { 48 49 if(a[i]==0) 50 { 51 if(i==8) 52 t=t*100+10; 53 else 54 t=t*10+(i+2); 55 --g; 56 } 57 else if(a[i]==1) 58 { 59 Shi[g]='+'; 60 if(k==1) 61 sum+=t; 62 else 63 sum-=t; 64 t=i+2; 65 k=1; 66 } 67 else 68 { 69 Shi[g]='-'; 70 if(k==1) 71 sum+=t; 72 else 73 sum-=t; 74 t=i+2; 75 k=2; 76 } 77 ++g; 78 if(i==8) 79 { 80 Shi[g]='1'; 81 Shi[g+1]='0'; 82 g+=2; 83 } 84 else 85 Shi[g]=i+2+'0'; 86 } 87 if(k==1) 88 sum+=t; 89 else 90 sum-=t; 91 Shi[g-1]='\0'; 92 return sum; 93 }
运行结果:
*****************
本题是以前准备acm比赛时初赛的题目,可惜自己太水了,当时没做出来,寒假期间又把这道题看了一遍,结合上学期学过的数据结构知识,发现此题为深度优先搜索的典型范例。用了一下午时间做了出来,最多的时间花在了fun函数的运算上。
1:对栈的思想进一步加深。
2:对深度优先搜索有了进一步的了解~
由于此题为寒假所写,时间太长,具体细节很多都已经忘了。特此以后在编写程序时,要记录下值得学习的调试经过,发表在博客上,以便后来翻阅时用
2014年2月16日