蓝桥杯真题带分数

解法:全排列暴力枚举

思路:递归模拟全排列1-9,9位数的所有排列形式,再对每一个9位数进行组合划分为三个数,a,b,c只要满足目标数N=a+b/c成立即可。

组合数划分:对全排列的9位数只需用两个隔板隔离成三个连续的数即可。如a:1-2位,b:3-6位,c:7-9位等。从左到右分,第一个隔板从1位-7位,第二个隔板:从第一个隔板+1位—第8位.

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
//枚举全排列,枚举出所有可能的9位数然后9个数划分为三个数abc,n=a+b/c
int st[10];
bool used[10];
int cal(int *st,int l,int r)
{
    int ans=0;int x=1;
    for(int i=r;i>=l;i--)
    {
        ans=ans+x*st[i];
        x=x*10;
    }
    return ans;
}
int fans=0;
void dfs(int x,int n)
{
    if(x>9){
        //对9个数进行组合划分成3个数,只考虑位置不考虑顺序
        for(int i=1;i<=7;i++)
        {
            for(int j=i+1;j<=8;j++)
            {
                int a=cal(st,1,i);//1-2;1-3;1-4。。。1-7
                int b=cal(st,i+1,j);
                int c=cal(st,j+1,9);
                if(n*c==a*c+b)
                {
                    fans++;
                   // cout<<n<<"="<<a<<"+"<<b<<"/"<<c<<endl;
                }
            }
        }
        return;
    }
    for(int i=1;i<=9;i++)
    {
        if(used[i]==false)
        {
            st[x]=i;
            used[i]=true;
            dfs(x+1,n);
            used[i]=false;
        }
       
    }
    
}
int main()
{
    int n;cin>>n;
    dfs(1,n);
    cout<<fans;
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Luminous815

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值