蓝桥杯 带分数

 

问题描述

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
 
【搜索+剪枝】
 1 #include<iostream>
 2 #include<stdio.h>
 3 #include<string.h>
 4 using namespace std;
 5 
 6 int a[10],vis[10],ans;
 7 int const n=9;
 8 
 9 __int64 num,num1,num2,num3;
10 
11 __int64 solve(int i,int j)  // 从 a数组的第i位到第j位
12 {
13     __int64 temp=0;
14     for(int k=i;k<=j;k++)
15         temp=temp*10+a[k];
16     return temp;
17 }
18 
19 void count1()// 该排列 按顺序分为 num1 num2 num3三部分  结果能不能组合成num
20 {
21     int l=1;
22     __int64 temp;
23     temp=num;
24     while(temp=(temp/10))
25         l++;// num1 的长度
26     for(int i=0;i<l;i++)
27     {
28         num1=solve(0,i);
29         if(num1>num)
30             return ;
31         for(int j=(n-i)/2;j<=n-(i+1);j++)
32         {
33             num2=solve(i+1,i+j);
34             num3=solve(i+j+1,n-1);
35             //printf("%I64d    %I64d    %I64d\n",num1,num2,num3);
36             if(num3!=0&&num2>num3&&num2%num3==0&&num==num1+num2/num3)
37                 ans++;
38 
39         }
40 
41     }
42 
43 
44 }
45 
46 void dfs(int start,int n)
47 {
48     if(start==n)
49         count1();
50     for(int i=1;i<=9;i++)
51     {
52         if(vis[i])
53             continue;
54         a[start]=i;
55         vis[i]=1;
56         dfs(start+1,n);
57         vis[i]=0;
58     }
59 }
60 
61 
62 int main()
63 {
64     while(scanf("%I64d",&num)!=EOF)
65     {
66         memset(vis,0,sizeof(vis));
67         ans=0;
68         dfs(0,n);
69         printf("%d\n",ans);
70     }
71     return 0;
72 }

 

posted @ 2014-02-22 19:13  galaxy77  阅读(387)  评论(0编辑  收藏  举报