算法:带分数(递归与递推)

思路

本题可以枚举1到9的字典序,然后再枚举这三个数每一个数的位数,然后判断是否与系统所给的值相等。

问题描述

100 可以表示为带分数的形式:100=3+69258714
还可以表示为:100=82+3546197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。

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

输入格式

一个正整数。

输出格式

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

数据范围

1≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6

代码

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int number[10];
int main(){
    int n, m = 1;
    cin >> n;
    for(int i = 0; i < 9; ++i){
        number[i] = i + 1;
        m *= (i + 1);
    }
    double eps = 0.0000001;
    int cnt = 0;
    while(m--){
        for(int i = 1; i < 8; ++i){
            for(int j = 1; i + j < 9; ++j){
                int k = 9 - i - j;
                double a = 0, b = 0, c = 0;
                int x = 0;
                for(; x < i; ++x){
                    a = a * 10 + number[x];
                }
                for(; x < i + j; ++x){
                    b = b * 10 + number[x];
                }
                for(; x < 9; ++x){
                    c = c * 10 + number[x];
                }
                if(fabs((n - (a + (b / c)))) < eps){
                    cnt++;
                }
            }
        }
        next_permutation(number, number+9);
    }
    cout << cnt << endl;
    return 0;
}

原题链接添加链接描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

evil心安

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

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

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

打赏作者

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

抵扣说明:

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

余额充值