题目:1.凑算式 - 蓝桥云课 (lanqiao.cn)
视频解析:2016-C-C题6凑算式_哔哩哔哩_bilibili
这道题实际上是让我们把{1,2,3,4,5,6,7,8,9}这9个数字往ABCDEFGHJI这10个位置上填,算出来的结果还要求是10,问有多少种排列方式。其实就是
求全排列。
这道题的一个麻烦的地方在于因为存在两个分数相加的情况,分母如果不一致那么就要进行通分。
我们有一种通分策略:
第一个分数的分母*第二个分数的分母得到一个通分母,然后再进行相加,如下:
code
我们可以先用next_permuation()实现全排列,然后再进行通分,通分算出来的结果如果是10,就计数2一下
#include <iostream>
#include<algorithm>
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9};
int ans;
bool check()
{
int x=a[3]*100+a[4]*10+a[5];
int y=a[6]*100+a[7]*10+a[8];
//通分
if((a[1]*y+a[2]*x)%(y*a[2])==0&&(a[0]+(a[1]*y+a[2]*x)/(y*a[2]))==10)
return true;
return false;
}
int main()
{
//实现全排列部分
do
{
if(check()) //进行通分
ans++;
}while(next_permutation(a,a+9));
cout<<ans;
return 0;
}
自己手搓全排列代码
#include <iostream>
#include<algorithm>
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9};
int ans;
bool check()
{
int x=a[3]*100+a[4]*10+a[5];
int y=a[6]*100+a[7]*10+a[8];
if((a[1]*y+a[2]*x)%(y*a[2])==0&&(a[0]+(a[1]*y+a[2]*x)/(y*a[2]))==10)
return true;
return false;
}
void f(int k)
{
if(k==9)
{
if(check())
ans++;
}
for(int i=k;i<9;i++)
{
//交换位置
{ int t=a[i];a[i]=a[k];a[k]=t;}
f(k+1);
{int t=a[i];a[i]=a[k];a[k]=t;}
}
}
int main()
{
f(0);
cout<<ans;
return 0;
}