蓝桥杯 带分数

100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。

 

从标准输入读入一个正整数N (N<1000*1000)

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

注意:不要求输出每个表示,只统计有多少表示法!

 

 

看到这个题,想着用vis标记是否出现。但是感觉后面的分数可以无限改变形式,就没思路了

看了题解,感觉好厉害。

首先 因为1~9出现且都仅出现一次,可以去全排列

然后分为3部分,第一部分最多到7,第二部分最多到8,第三部分到最后

 

然后就可以写了。复杂度不会分析,

从 dfs(0,0)开始,表示从0位置,划分第1部分

然后用双层for枚举

其实就是这样的

1 -2-3456789

1-23-456789

……

1-2345678-9

12-3-456789

……

1234567-8-9

……

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 int a[9]={1,2,3,4,5,6,7,8,9};
 7 int ans,num[3],n;
 8 
 9 void dfs(int cur,int cnt) {
10     if(cnt>1) {
11         int sum=0;
12         for(int i=cur;i<9;i++) sum=sum*10+a[i];
13         num[cnt]=sum;
14         if(num[1]%num[2]==0&&num[0]+num[1]/num[2]==n) ans++;
15         return;
16     }
17     int dd=6+cnt;
18     for(int i=cur;i<=dd;i++) {
19         num[cnt]=0;
20         int sum=0;
21         for(int j=cur;j<=i;j++) {
22             sum=sum*10+a[j];
23         }
24         num[cnt]=sum;
25         dfs(i+1,cnt+1);
26     }
27 }
28 
29 int main() {
30     while(~scanf("%d",&n)) {
31         ans=0;
32         sort(a,a+9);
33         do{
34             dfs(0,0);
35         }while(next_permutation(a,a+9));
36         printf("%d\n",ans);
37     }
38 }

 

posted @ 2019-02-15 22:24  Frontierone  阅读(846)  评论(0编辑  收藏  举报