蓝桥 带分数

问题描述

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<bits/stdc++.h>
using namespace std;
#define Max 200050
int a[10],flag[10];
int ans;
int m,m1,m2,m3;

int sum(int start,int endd){
    int sum=0;
    for(int i=start;i<=endd;i++){
        sum=sum*10+a[i];
    }
    return sum;
}

void cheak(int a[]){
    for(int i=1;i<10;i++){
        m1=sum(1,i);
        if(m1>m) break;
        for(int j=(10-i)/2+i;j<9;j++){
            m2=sum(i+1,j);
            m3=sum(j+1,9);
            if(m2%m3==0&&m==m1+m2/m3)
                ans++;
        }
    }
}

void DFS(int start,int endd){
    if(start==endd){
        cheak(a);
    }
    else{
        for(int i=1;i<=9;i++){
            if(flag[i]){
                continue;
            }
            else{
                a[start]=i;
                flag[i]=1;
                DFS(start+1,endd);
                flag[i]=0;
            }
        }
    }
}


int main(){

    cin>>m;
    DFS(1,10);
    cout<<ans<<endl;
    return 0;
}

 

posted on 2019-03-02 16:33  ggsdduzdl  阅读(112)  评论(0)    收藏  举报

导航