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

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
>>思路
首先用全排列的代码生成排列,生成的同时带入算式看是否满足条件即可。
>>代码
1 #include<bits/stdc++.h> 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<bits/stdc++.h> 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 }

浙公网安备 33010602011771号