蓝桥杯-带分数

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

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

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

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

输入格式

一个正整数。

输出格式

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

数据范围

1≤N<1e6

输入样例1:

100

输出样例1:

11

输入样例2:

105

输出样例2:

6

题解:

  • 枚举所有 a 的情况, 在每种 a 的前提下, 再枚举所有 c 的情况
  • 根据 a, c, n 计算出 b
  • 判断是否满足 [1, 9] 仅出现过一次, 且 a, b, c中不含有0

代码并不是很长, 去除空行大概有五十行, 大家耐心看, 代码中有很多注释, 如果有不理解的地方可以再问~

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n, ans;
bool st[N], back[N];

bool check(int a, int c)
{
    int b = n * c - a * c;  // 公式: n = a + b / c  ==> b = n * c - a * c

    if (!a || !b || !c) return false;  //  会把 a b c 任意一个等于 0 的情况给筛掉

    memcpy(back, st, sizeof st);    // 赋值st的状态, 用于判断 [1, 9] 是否全出现过
    while (b)
    {
        int x = b % 10;     // 取个位
        b /= 10;    // 个位删掉
        if (!x || back[x]) return false;  // 保证 b 中不含 0, 同时 保证 [1, 9] 只出现过一次
        back[x] = true;
    }
    for (int i = 1; i <= 9; i ++) if (back[i] == false) return false;
    return true;
}

void dfs_c(int u, int a, int c)
{
    if (check(a, c)) ans ++;  //  这里同样可以不用管 c 是否为 0, check函数中有 处理 c 等于 0 的情况

    for (int i = 1; i <= 9; i ++)
    {
        if (st[i]) continue;
        st[i] = true;
        dfs_c(u + 1, a, c * 10 + i);
        st[i] = false;
    }
}

void dfs_a(int u, int a)  // 枚举 a 的所有可以能 (1, 12, 123, ... 987654321)
{
    if (a > n) return;   // 剪枝, a > n的时候 b,c没有满足条件的值 (没有这个也不会死循环, 有这个可以减少代码运行的时间)

    if(a != 0) dfs_c(u, a, 0);  // 这和判断可以写, 也可以不写, 写的话运行时间会快一些, 不写的话在check函数中对 等于 0 进行的处理
    
    for (int i = 1; i <= 9; i ++)  
    {
        if (st[i]) continue;
        st[i] = true;
        dfs_a(u + 1, a * 10 + i);
        st[i] = false;
    }
}

int main()
{
    cin >> n;
    
    dfs_a(0, 0);
    
    cout << ans << endl;
    return 0;
}

觉得写的不错的话, 点个赞吧~

相关推荐
AI科技星几秒前
光速飞行器动力学方程的第一性原理推导、验证与范式革命
数据结构·人工智能·线性代数·算法·机器学习·概率论
橘颂TA2 分钟前
【剑斩OFFER】算法的暴力美学——leetCode 946 题:验证栈序列
c++·算法·leetcode·职场和发展·结构与算法
闻缺陷则喜何志丹4 分钟前
【状态机动态规划】3686. 稳定子序列的数量|1969
c++·算法·动态规划·力扣·状态机动态规划
liulilittle6 分钟前
OPENPPP2 网络驱动模式
开发语言·网络·c++·网络协议·信息与通信·通信
mjhcsp10 分钟前
C++ AC 自动机:原理、实现与应用全解析
java·开发语言·c++·ac 自动机
寻星探路15 分钟前
【算法通关】双指针技巧深度解析:从基础到巅峰(Java 最优解)
java·开发语言·人工智能·python·算法·ai·指针
余瑜鱼鱼鱼16 分钟前
Java数据结构:从入门到精通(十)
数据结构
wen__xvn17 分钟前
力扣第 484 场周赛
算法·leetcode·职场和发展
好奇龙猫21 分钟前
【大学院-筆記試験練習:线性代数和数据结构(5)】
数据结构·线性代数
YuTaoShao28 分钟前
【LeetCode 每日一题】865. 具有所有最深节点的最小子树——(解法一)自顶向下
算法·leetcode·职场和发展