巧解算式

Description

12345678910个数中间加上加号或减号,使得到的表达式的值为自然数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日

 

转载于:https://www.cnblogs.com/ccode/p/3906008.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值