带分数[题解]

这篇博客介绍了如何利用C++的next_permutation和DFS算法解决蓝桥杯比赛中的一个数论问题。博主通过创建全排列并检查特定条件来找到满足条件的组合,展示了两种不同的实现方式,一个是基于next_permutation的迭代法,另一个是基于DFS的递归法。这两种方法都用于找出所有可能的整数乘积组合,当这些组合满足特定等式时进行计数。
摘要由CSDN通过智能技术生成

维生素C吃多了会上火-个人CSDN博文目录
2022蓝桥杯

题目链接

题解

next_permutation

#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
int num[]={1,2,3,4,5,6,7,8,9};
int cal(int l,int r){
  int res=0;
  for(int i=l;i<=r;i++){
  	res=res*10+num[i];
  }
  return res;
}
int main()
{
  int n;
  cin>>n;
  int cnt=0;
  while(next_permutation(num,num+9)){
    for(int i=0;i<9;i++){
      for(int j=i+1;j<9;j++){
        int a = cal(0,i);
        int b = cal(i+1,j);
        int c = cal(j+1,8);
        if(c*n == a*c+b){
          cnt++;
        }
      }
    }
  }
  cout<<cnt<<endl;
  return 0;
}

DFS

#include <iostream>
using namespace std;
int num[10];
bool used[10]; //生成全排列的过程中判断1-9时候用过
int n;
int cnt;
int cal(int l,int r){
  int res=0;
  for(int i=l;i<=r;i++){
    res=res*10+num[i];
  }
  return res;
}
void dfs(int u){//u是数组num的下标0-8
  if(u==9){
    for(int i=0;i<9;i++){
      for(int j=i+1;j<9;j++){
        int a=cal(0,i);
        int b=cal(i+1,j);
        int c=cal(j+1,8);
        if(n*c==a*c+b){
        	cnt++;
		}
      }
    }
    return;
  }
  for(int i=1;i<=9;i++){//填数组里面的内容
    if(used[i]==false){//标记1-9是否被用过
    	used[i]=true;
	    num[u]=i;
        dfs(u+1);
        used[i]=false;
    }
  }
}
int main()
{
  cin>>n;
  dfs(0);
  cout<<cnt<<endl;
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值