2016第七届蓝桥杯C凑算式 (全排列)

>>题目

 

 

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

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

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

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

>>思路

首先用全排列的代码生成排列,生成的同时带入算式看是否满足条件即可。

>>代码

 1 #include 
 2 using namespace std;
 3 int a[]={1,2,3,4,5,6,7,8,9};
 4 int ans=0;
 5 bool check(){
 6     int x=a[3]*100+a[4]*10+a[5];
 7     int y=a[6]*100+a[7]*10+a[8];
 8     if((a[0]+(a[1]*y+x*a[2])/(y*a[2]))==10&&((a[1]*y+x*a[2])%(y*a[2])==0)) return true;
 9     return false;
10 }
11 
12 void f(int k){
13     if(k==9){
14         if(check()) ans++;
15     }
16     for(int i=k;i<9;i++){
17         {int t=a[i];a[i]=a[k];a[k]=t;}
18         f(k+1);
19         {int t=a[i];a[i]=a[k];a[k]=t;}
20     }
21 }
22 int main(){
23     f(0);
24     cout<<ans;
25 }
①((a[1]*y+x*a[2])%(y*a[2])==0)非常容易漏掉的条件,整型四则运算的结果还是整型,会导致1+9.3=10这样的情况出现,一定要确保除法部分能除尽。
②也可以用next_permutation,代码如下。
 1 #include 
 2 using namespace std;
 3 int a[]={1,2,3,4,5,6,7,8,9};
 4 int ans=0;
 5 bool check(){
 6     int x=a[3]*100+a[4]*10+a[5];
 7     int y=a[6]*100+a[7]*10+a[8];
 8     if((a[0]+(a[1]*y+x*a[2])/(y*a[2]))==10&&((a[1]*y+x*a[2])%(y*a[2])==0)) return true;
 9     return false;
10 }
11 
12 int main(){
13     do{
14         if(check()) ans++;
15     }while(next_permutation(a,a+9));
16     cout<<ans;
17 }

 

你可能感兴趣的:(2016第七届蓝桥杯C凑算式 (全排列))