2016-省赛-C语言大学B组_凑算式

本文介绍了一种通过深度优先搜索(DFS)算法和全排列方法解决凑算式问题的方法,并给出了具体的C++实现代码及运行结果。该算式由1到9的数字组成,每个数字仅使用一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



凑算式


     B      DEF
A + --- + ------- = 10
     C      GHI
     
(如果显示有问题,可以参见【图1.jpg】)
 
 
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。


比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。


这个算式一共有多少种解法?


注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。


思路:用DFS去枚举所有情况,如果满足情况,则记录下来.

当然,也有人用全排列来解决.

DFS代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=0;
bool vis[10];
int a[10];
int ans=0;
void DFS(int x)//搜索第x个数字
{
    if(x==9)
    {
        double sum=a[0]+1.0*a[1]/a[2]+1.0*(a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]);
        if(a[0]+1.0*a[1]/a[2]+(100.0*a[3]+10*a[4]+a[5])/(100.0*a[6]+10*a[7]+a[8])==10)
        {
            ans+=1;
            cout<<ans<<":\t";
            cout<<a[0]<<"+"<<a[1]<<"/"<<a[2]<<"+";
            cout<<a[3]<<a[4]<<a[5]<<"/"<<a[6]<<a[7]<<a[8]<<endl;
        }
        return;
    }
    for(int i=1;i<10;i++)
    {
        if(!vis[i])
        {
            a[x]=i;
            vis[i]=true;
            DFS(x+1);
            vis[i]=false;
        }
    }
}
int main()
{
    memset(vis,false,sizeof(vis));
    DFS(0);
    cout<<ans<<endl;
    return 0;
}


运行结果:

1:      3+5/1+972/486
2:      4+9/3+528/176
3:      5+3/1+972/486
4:      5+4/3+726/198
5:      5+4/9+738/162
6:      5+8/6+473/129
7:      6+4/2+358/179
8:      6+4/2+718/359
9:      6+7/3+485/291
10:     6+8/3+952/714
11:     6+9/8+437/152
12:     7+1/4+968/352
13:     7+3/2+819/546
14:     7+3/2+981/654
15:     7+5/3+264/198
16:     7+5/3+912/684
17:     7+9/6+381/254
18:     7+9/6+813/542
19:     8+1/3+465/279
20:     8+6/9+712/534
21:     8+7/6+195/234
22:     9+1/3+452/678
23:     9+1/3+524/786
24:     9+2/4+178/356
25:     9+2/4+358/716
26:     9+3/4+157/628
27:     9+4/8+176/352
28:     9+4/8+356/712
29:     9+6/8+143/572
29

全排列方法代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
    double a[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    int ans = 0;
    do
    {
        if( a[0] + a[1]/a[2] + (a[3]*100+a[4]*10+a[5])/(a[6]*100+a[7]*10+a[8]) == 10.0)
            ans++;
    }while( next_permutation(a, a+9));
    printf("%d\n", ans);
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值