• 蓝桥杯带分数(难)


    问题描述

    100 可以表示为带分数的形式:100 = 3 + 69258 / 714。

    还可以表示为:100 = 82 + 3546 / 197。

    注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。

    类似这样的带分数,100 有 11 种表示法。

    输入格式

    从标准输入读入一个正整数N (N<1000*1000)

    输出格式

    程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。

    注意:不要求输出每个表示,只统计有多少表示法!

    样例输入1
    100
    样例输出1
    11
    样例输入2
    105
    样例输出2
    6
     
    #include <stdio.h>
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    // a+b=n,a为整数,b为分数 
    bool vis1[11];// a、b尝试时标记
    bool vis2[11]; // 检测b是否符合条件
    int ans=0;
    int bLen;
    int b;
    int checkA(int a){
        int aLen = 0; //a的长度
        while(a){
            if(vis1[a%10])
                return 0;
            vis1[a%10] = 1;
            a /= 10;
            aLen++;
        }
        return 9-aLen;//返回b可以用的数字个数 
    }
     
    int checkB(int x){
        int xLen = 0;
        memcpy(vis2,vis1,sizeof(vis2));
        while(x){
            if(vis2[x%10])
                return 0;
            vis2[x%10] = 1;
            x /= 10;
            xLen++;
        }
        return xLen;
    }
     
     
    void dfs(int yLen, int y)
    {
    if(yLen <= bLen/2) { if(checkB(y*b) == bLen-yLen)//y是分母,y*b等于分子 { ans++; return; } for(int i = 1; i < 10; i++) { if(vis1[i]) continue; vis1[i] = 1; dfs(yLen+1, y*10+i);//注意y*10+i vis1[i] = 0; } } } int main() { int n; cin>>n; ans = 0; for(int i = 1; i < n;i++) { vis1[0] = 1; // 不能有0 if(bLen = checkA(i))//b可以用数字个数 { b = n-i;//b的大小 dfs(0,0); } memset(vis1,0, sizeof vis1); } cout<<ans<<endl; return 0; }

    思路:

    把n看成a+b,遍历a,然后dfs分母,同时检查分子

  • 相关阅读:
    P2731 骑马修栅栏 Riding the Fences
    P1351 联合权值
    [脚本]为所有节点挂载磁盘
    [转]expect的安装
    挂载磁盘linux
    [转]Mac 科研常用软件
    [转]error while loading shared libraries 错误解决办法总结
    linux安装SVN
    Java web项目在linux环境下自动编译和部署脚本
    个人所得税计算方法
  • 原文地址:https://www.cnblogs.com/h694879357/p/12245464.html
Copyright © 2020-2023  润新知