带分数---搜索

来源:互联网 发布:三菱plc编程软件fx 编辑:程序博客网 时间:2024/06/05 19:45

问题描述
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 "iostream"#include "algorithm"#include "vector"#include "set"#include "string.h"#include "fstream"using namespace std;int N;int cnt = 0;int a, b, c;int vis[10];int num[10];int sum(int start, int end){    int tmp = 0;    for(int i=start; i<=end; i++)        tmp = tmp * 10 + num[i];    return tmp;}void check(){    for(int k=1; k<=8; k++)    {        a = sum(1, k);        if(a > N)            return;        for(int j=k+(9-k)/2; j<=8; j++)        {            b = sum(k+1, j);            c = sum(j+1, 9);            if(b>c && b%c==0 && N==a+b/c)                cnt++;        }    }}void dfs(int depth){    if(depth == 10)    {        check();    }    for(int i=1; i<=9; i++)    {        if(!vis[i])        {            num[depth] = i;            vis[i] = 1;            dfs(depth+1);            vis[i] = 0;            num[depth] = 0;        }    }}int main(){    cin >> N;    memset(vis, 0, sizeof(vis));    dfs(1);    cout << cnt;    return 0;}
0 0
原创粉丝点击