2016年蓝桥杯c组编程题 1.凑算式 知识点:全排列,分数通分

94 阅读2分钟

题目:1.凑算式 - 蓝桥云课 (lanqiao.cn) 视频解析:2016-C-C题6凑算式_哔哩哔哩_bilibili image.png 这道题实际上是让我们把{1,2,3,4,5,6,7,8,9}这9个数字往ABCDEFGHJI这10个位置上填,算出来的结果还要求是10,问有多少种排列方式。其实就是求全排列

这道题的一个麻烦的地方在于因为存在两个分数相加的情况,分母如果不一致那么就要进行通分

我们有一种通分策略

第一个分数的分母*第二个分数的分母得到一个通分母,然后再进行相加,如下:

image.png

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;
}