蓝桥杯 凑算式

凑算式

1
2
3
   B    DEF      
A + — + -— —— = 10
   C   GHI

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

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

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

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

这个题不多说了,直接暴力生成9的全排列然后去验证等式是否成立,只是验证的时候如果防止精度问题可以通分把除法变成乘法。
答案是:29

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//暴力生成9的全排列 dfs
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define MAX 10
int tmp[MAX];
int ans=0;
bool vis[10];
//void solve(int tmp[]){
// int t=tmp[0] +tmp[1]/tmp[2]+(tmp[3]*100+tmp[4]*10+tmp[5])/(tmp[6]*100+tmp[7]*10+tmp[8]);
// if(t==10) ans++;
//}

void solve(int num[])
{
double sum = num[0] + (double)num[1] / num[2] + (double)(num[3]*100+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8]);
if(sum == 10)
{
ans ++;
}
}


void dfs(int index){
if(index==9){
solve(tmp);
return;
}
for(int i=1;i<=9;i++){
if(!vis[i]){
tmp[index]=i;
vis[i]=true;
dfs(index+1);
vis[i]=false;
}
}
}
int main(){

dfs(0);
cout<<ans<<endl;



}

错误代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//暴力生成9的全排列 dfs
#include<bits/stdc++.h>
#include<iostream>
using namespace std;
#define MAX 10
vector<int> vec;
vector<int> v[MAX];
int vis[10];
int cnt=0,num;
void dfs(int k){
if(num==9){
vec.push_back(k);
for(int t=0;t<9;t++)
cout<<vec[t]<<" ";
cout<<endl;
v[cnt++]=vec;
vec.pop_back();
memset(vis,0,sizeof(vis));
num=0;
return;
}
vis[k]=true;
for(int i=1;i<=9;i++){
if(!vis[i]){
num++;//错误 Num是全局变量
vis[i]=true;
vec.push_back(i);
dfs(i);
vis[i]=false;
vec.pop_back();
}
}
}
int main(){
dfs(1);


}